繁体   English   中英

如何获取 .htaccess 将 REQUEST_URI 附加到 404 页面

[英]How to get .htaccess to attach REQUEST_URI to 404 page

有没有办法将请求 URI 作为 URL 变量发送到 404 页面? 例如,如果我使用ErrorDocument指令转发我的 404,有没有办法做这样的事情? 这是我试过的代码,但显然没有用。

ErrorDocument 404 /pages/errors/index.php?e=404&url=%{REQUEST_URI}

我也尝试了 mod_rewrite,但我也无法让它工作。 这是我用 mod_rewrite 尝试的:

Options +FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* /pages/errors/index.php?e=404&url=%{REQUEST_URI} [L,R=404]

基本上我想要做的就是当用户输入类似http://mysite.com/asdf它会转发到http://mysite.com/pages/errors/index.php?e=404&url=/asdf假设目录/asdf在服务器上不存在。

有没有简单的方法来实现这一目标?

我认为您不必将任何其他信息传递给错误处理程序脚本,如果这就是您的问题的话。 Apache 提供了足够的信息:

重定向到另一个 URL 可能很有用,但前提是可以传递一些信息,然后可以使用这些信息更清楚地解释或记录错误情况。

为了实现这一点,当发送错误重定向时,将设置额外的环境变量,这些变量将从提供给原始请求的标头生成,方法是在原始标头名称上添加“REDIRECT_”。 这为错误文档提供了原始请求的上下文。

例如,除了更常见的环境变量之外,您可能还会收到以下内容。

REDIRECT_HTTP_ACCEPT= / , 图像/gif, 图像/jpeg, 图像/png

REDIRECT_HTTP_USER_AGENT=Mozilla/5.0 Fedora/3.5.8-1.fc12 Firefox/3.5.8

REDIRECT_PATH=.:/bin:/usr/local/bin:/sbin

REDIRECT_QUERY_STRING=

REDIRECT_REMOTE_ADDR=121.345.78.123

REDIRECT_REMOTE_HOST=client.example.com

REDIRECT_SERVER_NAME=www.example.edu

REDIRECT_SERVER_PORT=80

REDIRECT_SERVER_SOFTWARE=Apache/2.2.15

REDIRECT_URL=/cgi-bin/buggy.pl

REDIRECT_ 环境变量是从重定向之前存在的环境变量创建的。 它们使用 REDIRECT_ 前缀重命名,即 HTTP_USER_AGENT 变为 REDIRECT_HTTP_USER_AGENT。

REDIRECT_URL、REDIRECT_STATUS 和 REDIRECT_QUERY_STRING 保证被设置,并且其他标头只有在错误条件之前存在时才会被设置。

如果 ErrorDocument 目标是外部重定向(任何以 http: 之类的方案名称开头的内容,即使它指的是与服务器相同的主机),这些都不会被设置。

检查此链接

我认为您需要删除R=404 这对我有用;

Options +FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php?e=404&url=%{REQUEST_URI} [L]

测试: foo/index.php : print_r($_GET)

localhost/foo -> Array ( )

localhost/foo/asdf -> Array ( [e] => 404 [url] => /foo/asdf )

您第一次尝试将%{REQUEST_URI}放在ErrorDocument指令中,现在应该可以在最新版本的 Apache 中使用。 来自https://httpd.apache.org/docs/2.4/mod/core.html#errordocument

从 2.4.13 开始,可以在指令内部使用表达式语法来生成动态字符串和 URL。

我有另一个想法,既然您使用的是 php,为什么不直接访问$_SERVER['HTTP_REFERER'] 这显示了您之前的页面请求,因此大概这正是您要查找的内容。 从那里,您可以使用该值做您想做的事情。 那样有用吗?

您已经通过 rewritecond 检查 rewriterule 之前存在的文件/文件夹,您不需要在重写规则中使用请求 uri并通过$_SERVER['REQUEST_URI']处理它

Options +FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* /pages/errors/index.php?e=404 [L,R=404]

终于得到了这个工作,尽管有点非常规。 不幸的是,我使用的是 ColdFusion 而不是 PHP,这里的其他答案对我不起作用。 但我认为这对任何人都适用,无论他们的服务器端平台如何,因为它是基于 javascript 的:

在 .htaccess 中:

ErrorDocument 404 /mark404.cfm

在 /mark404.cfm

<script>
   window.location = '/handle404.cfm';
</script>

在/handle404.cfm

<script>
    var r = document.referrer;
    //this is what you want, the url that the user tried to hit
</script>

这样做的原因是浏览器在点击 mark404 时仍然“认为”它在请求的 dontexist.html 上。 因此,当您重定向到 handle404 时,donstexist.html 在浏览器历史记录中并且 javascript 可以获取它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM