Apache $从重写规则中获取[quot;foo";]NULL
我正在尝试重定向到 我在.htaccess中尝试了以下操作Apache $从重写规则中获取[quot;foo";]NULL,apache,.htaccess,mod-rewrite,Apache,.htaccess,Mod Rewrite,我正在尝试重定向到 我在.htaccess中尝试了以下操作 RewriteEngine on RewriteCond %{REQUEST_URI} ^/tour/(.+)/?$ RewriteRule ^tour/(.+)/?$ tour.php?name=$1 [L,QSA, NC] 它重定向到,但$\u GET[“name”]始终为空 如果我将目标页面更改为tour.php以外的任何内容,它都可以工作 RewriteRule ^tour/(.+)/?$ handler.php?na
RewriteEngine on
RewriteCond %{REQUEST_URI} ^/tour/(.+)/?$
RewriteRule ^tour/(.+)/?$ tour.php?name=$1 [L,QSA, NC]
它重定向到,但$\u GET[“name”]始终为空
如果我将目标页面更改为tour.php以外的任何内容,它都可以工作
RewriteRule ^tour/(.+)/?$ handler.php?name=$1
RewriteRule ^tour/(.+)/?$ blah.php?name=$1
所有工作您需要通过以下方式禁用:
在您的.htaccess中
和AcceptPathInfo关闭
一些解释:
第一个问题是内容谈判。假设您有两个名为tour.txt和tour.php的文件,如果启用了内容协商,如果您的URL只是一个没有扩展名的文件,Apache会根据客户机首选项(特别是本例中的Accept HTTP头)查找名为tour的文件,并带有任何扩展名,将尝试在tour.txt和tour.php之间找到最佳匹配项,以服务于客户端
问题的第二个元素是AcceptPathInfo:启用时,Apache接受URL路径末尾多余的部分作为内部变量填充(例如PHP中众所周知的$\u服务器['path\u INFO']
)。为了举例说明,假设您有一个文件tour.php。因此,在启用AcceptPathInfo
的情况下,使用$\u服务器['PATH\u INFO']
=/extra/PATH调用tour.php,而不是像通常预期的那样将其视为不远处(404)/AcceptPathInfo禁用时
现在,将AcceptPathInfo和内容协商结合起来:问题是您的规则试图“截取”以tour/开头的内容,但tour.php存在[是一个文件],因此它与您自己的规则冲突,因为路径tour/foo[对于URL,首先由内容协商tour.php/foo解决,并通过$\u服务器“接受”tour.php解决['PATH_INFO']
=/foo多亏了AcceptPathInfo。结论:在这个非常特殊的例子中,没有发生重写,但看起来是这样的,因为内容协商+AcceptPathInfo这类在tour.php上具有相同的效果,这就是为什么您没有得到预期的查询字符串(name=foo)
还请注意,规则中NC标志前不应有任何空格。您需要通过以下方式禁用:
在您的.htaccess中
和AcceptPathInfo关闭
一些解释:
第一个问题是内容协商。假设您有两个名为tour.txt和tour.php的文件,如果启用了内容协商,如果您的URL只是一个没有扩展名的文件,Apache会根据客户端首选项(尤其是本例中的Accept HTTP头)查找名为tour的文件,该文件具有任何扩展名,将尝试在tour.txt和tour.php之间找到最佳匹配项,以服务于客户端
问题的第二个元素是AcceptPathInfo:启用时,Apache接受URL路径末尾多余的部分作为内部变量填充(例如PHP中众所周知的$\u服务器['path\u INFO']
)。举例来说,假设您有一个文件tour.php。因此,如果启用了AcceptPathInfo
,则使用$\u服务器['PATH\u INFO']
=/extra/PATH调用tour.php,而不是像通常预期的那样,将AcceptPathInfo禁用
现在,将AcceptPathInfo和内容协商结合起来:问题是您的规则试图“截取”以tour/开头的内容,但tour.php存在[是一个文件],因此它与您自己的规则冲突,因为路径tour/foo[对于URL,首先由内容协商tour.php/foo解决,并通过$\u服务器“接受”tour.php解决['PATH_INFO']
=/foo多亏了AcceptPathInfo。结论:在这个非常特殊的例子中,没有发生重写,但看起来是这样的,因为内容协商+AcceptPathInfo这类在tour.php上具有相同的效果,这就是为什么您没有得到预期的查询字符串(name=foo)
还要注意的是,在规则中NC标志之前不应该有任何空格
Options -MultiViews