Php 如何获取.htaccess以将请求_URI附加到404页面
有没有办法将请求URI作为URL变量发送到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
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错误文档的内部子请求。