Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache $从重写规则中获取[quot;foo";]NULL_Apache_.htaccess_Mod Rewrite - Fatal编程技术网

Apache $从重写规则中获取[quot;foo";]NULL

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

我正在尝试重定向到

我在.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?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