RewriteRule上的错误500

时间:2016-10-07 15:45:35

标签: .htaccess mod-rewrite

我想要以下行为:

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&param=third

因此我创建了以下.htaccess(在mysubdir内部)

RewriteEngine on
RewriteBase /mysubdir/
RewriteRule ^([^\/]+)\/([^\/]+)\/([^\/]+)\/? ./redirect.php?token=$1&action=$2&param=$3 [L]
RewriteRule ^([^\/]+)\/([^\/]+)\/? ./redirect.php?token=$1&action=$2 [L]
RewriteRule ^([^\/]+)\/? ./redirect.php?token=$1 [L]

这会导致错误500

但是,如果我删除最后一行,前两个规则按预期工作。我无法看到这些规则之间存在任何明显的差异,这些规则会造成这样的错误。

1 个答案:

答案 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&param=$3 [L,QSA]

RewriteRule ^([^/]+)/([^/]+)/?$ redirect.php?token=$1&action=$2 [L,QSA]

RewriteRule ^([^/]+)/?$ redirect.php?token=$1 [L,QSA]

进行的更改很少:

  1. 使用QSA保留网址中的任何现有查询字符串。
  2. 您应该在正则表达式模式中使用锚$
  3. 无需以正则表达式模式转义/