我想要以下行为:
http://www.example.com/mysubdir -> show /mysubdir/index.htm
http://www.example.com/mysubdir/first -> show /mysubdir/redirect.php?token=first
http://www.example.com/mysubdir/first/second -> show /mysubdir/redirect.php?token=first&action=second
http://www.example.com/mysubdir/first/second/third -> show /mysubdir/redirect.php?token=first&action=second¶m=third
因此我创建了以下.htaccess(在mysubdir内部)
RewriteEngine on
RewriteBase /mysubdir/
RewriteRule ^([^\/]+)\/([^\/]+)\/([^\/]+)\/? ./redirect.php?token=$1&action=$2¶m=$3 [L]
RewriteRule ^([^\/]+)\/([^\/]+)\/? ./redirect.php?token=$1&action=$2 [L]
RewriteRule ^([^\/]+)\/? ./redirect.php?token=$1 [L]
这会导致错误500
但是,如果我删除最后一行,前两个规则按预期工作。我无法看到这些规则之间存在任何明显的差异,这些规则会造成这样的错误。
答案 0 :(得分:2)
您收到500(内部服务器错误),因为您的规则无限循环,因为您的上一个规则中存在[^/]+
也会与重写的URI redirect.php
匹配。
您可以使用此修改后的代码修复它:
RewriteEngine on
RewriteBase /mysubdir/
# skip all files and directories from rewrite rules below
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ redirect.php?token=$1&action=$2¶m=$3 [L,QSA]
RewriteRule ^([^/]+)/([^/]+)/?$ redirect.php?token=$1&action=$2 [L,QSA]
RewriteRule ^([^/]+)/?$ redirect.php?token=$1 [L,QSA]
进行的更改很少:
QSA
保留网址中的任何现有查询字符串。$
。/
。