可选的尾部斜杠mod_rewrite

时间:2012-12-10 19:40:10

标签: apache .htaccess mod-rewrite

我有一个非常具体的问题。 标题提供了许多其他正确答案的问题,但我不知道如何将其与我自己的重写规则相符合。

我的.htaccess看起来像这样:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^[^/]*/?$ index.php [NC,L]
RewriteCond %{REQUEST_URI} !(^/dev/zeroyear/$)
RewriteRule ^dev/zeroyear/([^/]+)/?([^/]*)/?([^/]*)/?([^/]*)/?$ /dev/zeroyear/index.php?var1=$1&var2=$2&var3=$3&var4=$4 [L,QSA]

我希望以下2个网址重定向到同一页面:

http://timesheep.name/dev/zeroyear/news
http://timesheep.name/dev/zeroyear/news/

最后一次重写规则因为我输入的问号而导致500,但日志没有说明。如果我改成它:

RewriteRule ^dev/zeroyear/([^/]+)/([^/]*)/?([^/]*)/?([^/]*)/?$ /dev/zeroyear/index.php?var1=$1&var2=$2&var3=$3&var4=$4 [L,QSA]

错误消失,但http://timesheep.name/dev/zeroyear/news将返回404。

我该怎么办?

1 个答案:

答案 0 :(得分:1)

你有混合的非贪婪的比赛(会占用可选的/)和可选的/混合在一起。尝试将它们分成不同的匹配项:

RewriteCond %{REQUEST_URI} !(^/dev/zeroyear/$)
RewriteRule ^dev/zeroyear/([^/]+)/([^/]+)/([^/]+)/([^/]+?)/?$ /dev/zeroyear/index.php?var1=$1&var2=$2&var3=$3&var4=$4 [L,QSA]

RewriteCond %{REQUEST_URI} !(^/dev/zeroyear/$)
RewriteRule ^dev/zeroyear/([^/]+)/([^/]+)/([^/]+?)/?$ /dev/zeroyear/index.php?var1=$1&var2=$2&var3=$3 [L,QSA]

RewriteCond %{REQUEST_URI} !(^/dev/zeroyear/$)
RewriteRule ^dev/zeroyear/([^/]+)/([^/]+?)/?$ /dev/zeroyear/index.php?var1=$1&var2=$2 [L,QSA]

RewriteCond %{REQUEST_URI} !(^/dev/zeroyear/$)
RewriteRule ^dev/zeroyear/([^/]+?)/?$ /dev/zeroyear/index.php?var1=$1 [L,QSA]