Php URL重写向客户端显示查询字符串

Php URL重写向客户端显示查询字符串,php,apache,.htaccess,mod-rewrite,Php,Apache,.htaccess,Mod Rewrite,我正在ApacheHTTPD中使用mod_rewrite实现友好的URL。我的.htaccess文件如下所示: RewriteEngine On rewritecond %{REQUEST_URI} !((.php|.htm|.css|.jpg|.png|.gif|.js|.ico)|/static/|/uploads/) RewriteRule (.*) /main.php?path=$1 [QSA,L] RewriteEngine On RewriteCond %{REQUEST_F

我正在ApacheHTTPD中使用mod_rewrite实现友好的URL。我的.htaccess文件如下所示:

RewriteEngine On 
rewritecond %{REQUEST_URI} !((.php|.htm|.css|.jpg|.png|.gif|.js|.ico)|/static/|/uploads/)
RewriteRule (.*) /main.php?path=$1 [QSA,L]
RewriteEngine On 

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /main.php?path=$1 [QSA,L]

RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+?)/$ /main.php?path=$1 [QSA,L]
(我知道这有点混乱,它与我稍后将修复的遗留代码有关)

如果用户输入的URL看起来像

但是,如果用户忘记了后面的斜杠

然后他们被重定向到

这使得URL非常难看,我想修复它,但是我对mod_rewrite的理解不够,不知道哪里出了问题。有没有人能帮我


谢谢

发生这种情况的原因是
mod_dir
在目录前面添加了一个尾随斜杠。您应该使用
RewriteCond
跳过重写现有文件/目录,如下所示:

RewriteEngine On 
rewritecond %{REQUEST_URI} !((.php|.htm|.css|.jpg|.png|.gif|.js|.ico)|/static/|/uploads/)
RewriteRule (.*) /main.php?path=$1 [QSA,L]
RewriteEngine On 

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /main.php?path=$1 [QSA,L]

RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+?)/$ /main.php?path=$1 [QSA,L]

最后,我重新安排了我的目录结构,整理了.htaccess文件,只包含

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) /main.php?path=$1 [QSA]
这确实意味着我将不得不进行更多的手动404错误处理,但这对我来说并不是什么大问题,因为我的URL结构的性质意味着我无论如何都必须这样做

感谢阿努巴瓦帮我解决了这个问题,我已经将他的答案标记为正确的,尽管他的评论确实帮助了我


编辑:对于重写,使用请求文件名而不是请求URI是非常重要的。我不知道为什么,但如果使用了错误的重写引擎,它就不起作用。

这似乎完全禁用了重写引擎,现在访问会出现404错误。要澄清这一点,应执行内部重定向到。编辑:嗯,我做了更多的测试,看起来你的mod_dir诊断是正确的,因为只有当要重写的路径实际存在于WWW目录中时,问题才会生效。我可能只是把所有这些目录移到一个bts文件夹中,应该会修复它。
/test
是一个目录吗?是的,我刚刚发现这就是问题所在。我尝试过关闭DirectorySlash,但似乎没有帮助…出于安全原因,请保持启用
DirectorySlash
。是否要将真实目录发送到
/main.php?path=
也?嗯,还是运气不好,更新的规则仍然会导致重写引擎始终被完全忽略。我想把我所有的文件夹移出WWW是很容易的,所以这不是一个大问题。