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 .htaccess在查询与目录匹配时发出HTTP重定向_Apache_.htaccess_Mod Rewrite - Fatal编程技术网

Apache .htaccess在查询与目录匹配时发出HTTP重定向

Apache .htaccess在查询与目录匹配时发出HTTP重定向,apache,.htaccess,mod-rewrite,Apache,.htaccess,Mod Rewrite,我使用mod_rewrite将查询发送到PHP,以便在CMS中处理。我的问题是:如果查询是目录名,那么发送到PHP的查询将添加到URL中 代码如下: RewriteCond %{REQUEST_FILENAME} !-f RewriteRule (.*) /process.php\?query=$1 [QSA,NC,L] 因此,如果用户输入 http://example.com/lolcats mod_rewrite静默重定向到 http://example.com/process.php?

我使用mod_rewrite将查询发送到PHP,以便在CMS中处理。我的问题是:如果查询是目录名,那么发送到PHP的查询将添加到URL中

代码如下:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) /process.php\?query=$1 [QSA,NC,L]
因此,如果用户输入

http://example.com/lolcats
mod_rewrite静默重定向到

http://example.com/process.php?query=lolcats
这很好。但是,如果
lolcats
是一个目录,mod_rewrite将重定向(而不是静默地)到

将查询添加到原始请求的末尾。Apache仍然提供PHP输出,但它更改了用户地址栏中的URL


因此,我需要阻止将查询添加到请求中,即使该查询是目录名。

这是一个
目录斜杠问题,当您尝试访问目录时,apache会用一个尾随斜杠重定向

您可以关闭
DirectorySlash
(注意有),或者尝试让mod_rewrite以如下方式抢先处理它:

# Above your existing rules
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)$ /$1/ [R=301,L]

# and small modification to your existing rule to handle trailing slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)/$ /process.php\?query=$1 [QSA,NC,L]

虽然如果您通过
process.php
路由所有现有目录,安全警告可能会被忽略。

我使用了上面Jon Lin提供的解决方案,对规则稍加修改,添加了一个尾随斜杠:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ $1/ [L,R=301]
这使得该规则适用于包含多个斜杠的地址,例如

http://example.com/path/to/page
对PHP的主要重写完全如Jon所述:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)/$ /process.php\?query=$1 [QSA,NC,L]

谢谢我最终使用了第二个选项,因为我希望在默认情况下添加尾部斜杠。我对斜杠重写做了一个小改动(见我的答案)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)/$ /process.php\?query=$1 [QSA,NC,L]