我已经尝试了我能找到的每一个例子,它们都会产生内部服务器错误。我已经设置了这些规则(这很有效,没有错误):
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}/index.php !-f
RewriteRule ^((/?[^/]+)+)/?$ ?q=$1 [L]
因此,如果它不是现有文件或带有index.php的现有目录,我们会重定向。例如,http://domain.com/foo/bar
变为http://domain.com/?q=foo/bar
事情是,我希望剥离斜杠。因此,在规则结束时取消/?
。我如何制作http://domain.com/foo/bar/
成为http://domain.com/foo/bar
,可见重定向优先(修复客户端的网址),只有然后真实,静默重定向到?q=
?
我看到的任何地方都看到了这一点:
RewriteRule (.*)/$ $1 [R,L]
但如果我在我的规则之前插入它,它会给我500错误。
答案 0 :(得分:3)
如果foo / bar作为真实目录存在,则服务器将客户端重定向到foo / bar /(带有斜杠)。必须这样做才能使相对URL在客户端上正常工作。如果您通过重定向将规则重写为foo / bar,则会出现循环。测试是否发生这种情况的简单方法是指定一个根本不存在的路径(我假设你的index.php检测到目录树实际存在)。不存在的路径不会触发内置重定向。
如果我为您设置了一组类似的规则(加上建议的斜杠删除规则),我可以看到存在的目录与不存在的目录之间的区别。那些没有按预期工作的那些,确实导致Firefox说这个页面没有正确重定向。 IE8说了类似的话。也许您正在使用的Apache设置可以检测到它并将其转换为500错误?
答案 1 :(得分:0)
看起来您在问题末尾提到的更简单的重写规则应该有效。问题是,500错误对于弄清楚它为什么不起作用并没有多大帮助。我发现有助于调试mod_rewrite错误的一种方法是启用它的日志记录。将以下内容添加到httpd.conf:
RewriteLog "/usr/local/var/apache/logs/rewrite.log"
RewriteLogLevel 3
然后再试一次,查看日志以查看发生了什么。完成后,您可以禁用日志设置rewriteloglevel 0
。有关详细信息,请参阅mod_rewrite docs。
答案 2 :(得分:0)
在当前规则前尝试此规则:
RewriteRule (.*)/$ /$1 [R,L]
答案 3 :(得分:0)
请尝试以下规则:
#prevent mod_dir from adding slash
DirectorySlash Off
#redirect /folder/ to /folder
RewriteCond %{THE_REQUEST} ^GET\s\S+/(\?\S+)?\s [NC]
RewriteRule ^(.*)/$ /$1 [R=301,L,QSA]
#internal redirect for directories
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} !/$
RewriteRule ^(.*)$ /$1/ [L]