Php 如何获取.htaccess以将请求_URI附加到404页面

Php 如何获取.htaccess以将请求_URI附加到404页面,php,.htaccess,mod-rewrite,errordocument,Php,.htaccess,Mod Rewrite,Errordocument,有没有办法将请求URI作为URL变量发送到404页面?例如,如果我用ErrorDocument指令转发我的404,有没有这样的方法?这是我试过的代码,但显然不起作用 ErrorDocument 404 /pages/errors/index.php?e=404&url=%{REQUEST_URI} 我还尝试了一个mod_重写,但我也无法让它工作。以下是我用mod_rewrite尝试的内容: Options +FollowSymLinks RewriteEngine On Rewrit

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

ErrorDocument 404 /pages/errors/index.php?e=404&url=%{REQUEST_URI}
我还尝试了一个mod_重写,但我也无法让它工作。以下是我用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


有没有一种简单的方法可以实现这一点?

我有另一个想法,既然您使用的是php,为什么不直接访问
$\u服务器['HTTP\u REFERER']
。这显示了您的上一个页面请求,所以推测它正是您要查找的内容。从那里,你可以用这个值做你想做的事情。这行得通吗?

您一直在通过rewritecond检查rewriterule之前存在的文件/文件夹,您不需要在rewriterule中使用请求uri并通过
$\u服务器['request\u uri']处理它。

Options +FollowSymLinks
RewriteEngine On

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

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

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

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

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

重定向\u HTTP\u ACCEPT=/,image/gif,image/jpeg,image/png

重定向\u HTTP\u USER\u AGENT=Mozilla/5.0 Fedora/3.5.8-1.fc12 Firefox/3.5.8

重定向路径=。:/bin:/usr/local/bin:/sbin

重定向\u查询\u字符串=

重定向远程地址=121.345.78.123

重定向\u REMOTE\u HOST=client.example.com

重定向\u服务器\u名称=www.example.edu

重定向\u服务器\u端口=80

重定向\u服务器\u软件=Apache/2.2.15

重定向_URL=/cgi-bin/buggy.pl

重定向uu环境变量是根据重定向之前存在的环境变量创建的。它们使用重定向前缀重命名,即HTTP用户代理变为重定向HTTP用户代理

保证设置重定向\u URL、重定向\u状态和重定向\u查询\u字符串,并且仅当其他头在错误条件之前存在时,才会设置这些头

如果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($\u GET)

localhost/foo->Array()


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

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

在.htaccess中:

ErrorDocument 404 /mark404.cfm
In/mark404.cfm

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

window.location='/handle404.cfm';
In/handle404.cfm

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

var r=文件引用人;
//这就是你想要的,用户试图点击的url

这样做的原因是浏览器在点击mark404时仍然“认为”它位于请求的doesntexist.html上。因此,当您重定向到handle404时,doesntexist.html会出现在浏览器历史记录中,javascript可以检测到它。

您第一次尝试将
%{REQUEST\u URI}
放入
ErrorDocument
指令中,现在应该可以在最新版本的Apache中工作。发件人:

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


你能试着使用重定向,然后检查404 php上的引用者吗?我试过了,$\u服务器['REQUEST\u URI']但都不起作用,它们都是空的。我试过了,$\u服务器['REQUEST\u URI']但都不起作用,结果都是空的。@danL读了这条评论,并没有对这条评论发表“答案”,我在pastebin中键入了一些代码,用于解决您在$\u服务器上遇到的问题。。实际上,我是通过使用$\u SERVER['REDIRECT\u URL']实现的。不过,谢谢!
R=404
标志将导致替换被忽略,并将触发对Apache 404错误文档的内部子请求。