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

时间:2014-03-24 05:41:22

标签: php apache .htaccess mod-rewrite

我在Apache HTTPD中使用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]

(我知道它有点混乱,它与遗留代码相关,我将在以后修复)

如果用户输入的内容类似于

,则此功能非常有效
  

http://example.com/test/

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

  

http://example.com/test

然后他们被重定向到

  

http://example.com/test/?path=test

这会让网址变得非常丑陋,而且我想修复它,但是我对mod_rewrite的理解不足以了解错误。有没有人有机会帮助我?

谢谢!

2 个答案:

答案 0 :(得分:1)

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

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]

答案 1 :(得分:0)

最后,我重新安排了我的目录结构并整理了我的.htaccess文件以简单地包含

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

这确实意味着我将不得不进行更多的手动404错误处理,但这对我来说并不是一个大问题,因为我的URL结构的性质意味着无论如何我都必须这样做。

非常感谢anubhava帮助我解决这个问题,我已经将他的答案标记为正确,尽管他的评论确实帮助了我。

编辑:对RewriteConds使用REQUEST_FILENAME而不是REQUEST_URI非常重要。我不确定为什么,但是如果你使用错误的话就不行。