2010-10-12 139 views
2

我试过了我能找到的每一个例子,它们都会产生内部服务器错误。我有这些规则设置(这工作,没有错误):用mod_rewrite删除尾部斜杠

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带有明显的重定向第一个(修复客户端的URL),并且只有然后真实,无声的重定向到?q=

我到处看看我看到这一点:

RewriteRule (.*)/$ $1 [R,L] 

但它给我,如果我在我的规则之前插入一个500错误。

+0

你有机会获得正常Apache的错误日志?他们至少会给出导致500错误的一般描述。 – 2010-10-14 18:26:20

+0

@Tim:我这样做,但他们似乎没有记录到错误日志。我在原始访问日志中看到它们,但没有任何用处。后面的斜杠重定向似乎是“工作的”(因为它不是错误的原因,虽然它重定向到错误的位置;这是一个单独的问题),那么脚本500就会出现在真正的规则上, 去搞清楚)。 – 2010-10-14 18:45:26

+0

而不加入重定向规则去*/foo/bar *也可以,对吧?嗯.. – 2010-10-15 19:42:41

回答

3

如果富/酒吧存在作为一个真正的目录,然后服务器会将客户端重定向到富/酒吧/(与结尾的斜线) 。它必须这样做才能使相对URL在客户端上正确工作。如果你把一个规则重写回foo/bar并重定向,那么会有一个循环。测试这种情况的简单方法是指定一个根本不存在的路径(我从你的index.php检测中假定目录树实际存在)。不存在的路径不会触发内置的重定向。

如果我为您设置了一组类似的规则(加上建议的斜杠去除规则),我可以看到存在的目录和不存在的目录之间的区别。那些不能按预期工作,那些导致Firefox说这个页面没有正确重定向。 IE8说了类似的东西。也许你正在使用的Apache设置可以检测到它,并将其变成500错误?

+0

这似乎是合理的。但是,那么你是说它无法完成?好的,也许我应该在重定向之后执行index.php本身的尾部斜线的剥离。谢谢。 – 2010-10-21 09:59:15

+0

如果您愿意将目录树移动到其他位置,可以完成此操作。或者至少是尚未使用index.php填充的那部分树。记住你的外部斜杠消除重定向,相对链接将会遇到服务器试图避免的问题:在返回'.../foo的页面中链接'SRC =“pic.jpg”''/bar'会被客户*转换为'.../foo/pic.jpg'而不是'.../foo/bar/pic.jpg'。这是服务器的斜杠添加重定向的全部要点。 – 2010-10-21 16:39:49

+0

随着整个URL重写方案,无论如何需要建立一个基地址,所以它不是一个额外的问题。这就是[](http://www.w3schools.com/tags/tag_base.asp)。 – 2010-10-23 08:38:20

0

它看起来像你在问题结束时提到的更简单的重写规则应该工作。问题是,500错误在确定它不工作的原因方面并没有真正的帮助。我发现一种有助于调试mod_rewrite错误的方法是启用日志记录。将以下内容添加到您的httpd.conf中:

RewriteLog "/usr/local/var/apache/logs/rewrite.log" 
    RewriteLogLevel 3 

然后重试,然后查看日志以查看发生了什么。完成后,您可以禁用日志设置rewriteloglevel 0。有关详细信息,请参阅mod_rewrite docs

+0

问题是,我没有访问任何我知道的'httpd.conf'。 – 2010-10-12 18:42:02

0

尝试在当前规则的前面这条规则:

RewriteRule (.*)/$ /$1 [R,L] 
+0

那500也是。 – 2010-10-13 08:06:16

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]