8

有没有办法将请求 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/asdfthen 的内容时,它会转发到http://mysite.com/pages/errors/index.php?e=404&url=/asdf假设/asdf服务器上不存在该目录。

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

4

6 回答 6

3

如果这是您的问题,我认为您不必将任何其他信息传递给错误处理程序脚本。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: 之类的方案名称开头的任何内容,即使它引用与服务器相同的主机),这些都不会设置。

检查此链接

于 2013-01-26T02:17:20.217 回答
2

我认为您需要删除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 )

于 2013-01-26T02:38:08.617 回答
1

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

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

于 2020-06-30T13:57:23.803 回答
0

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

于 2013-01-26T01:59:12.190 回答
0

您已经通过 rewritecond 检查重写之前存在的文件/文件夹,您不需要在重写规则中使用请求 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]
于 2013-01-26T02:10:01.147 回答
0

终于得到了这个工作,虽然有点不合常规。我在 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 时仍然“认为”它位于请求的 doesntexist.html 上。因此,当您重定向到 handle404 时,doesntexist.html 会出现在浏览器历史记录中,并且 javascript 可以获取它。

于 2015-11-13T04:15:47.253 回答