RewriteCond根据url的第一部分不起作用

时间:2013-08-11 16:38:03

标签: .htaccess rewrite

我正在努力做一些改写,但它没有用。这是我的代码:

RewriteCond %{REQUEST_URI} !^(static/|server/|internal.php).*$
RewriteRule ^(.*)$ /internal.php?request=$1 [L]

我正在尝试将所有内容重定向到/internal.php?request=blablabla,除了internal.php本身,以及两个名为static和server的文件夹中的内容,因为这两个文件夹都有图像等等。

例如,
/hello/world => /internal.php?request=hello/world/
/static/a/b/c/a.jpg => /static/a/b/c/a.jpg 未更改

但代码不起作用,RewriteCond似乎无法限制internal.php和两个文件夹的重写。现在发生的事情就是将所有内容重写为internal.php,而internal.php将再次重写为internal.php。最后在无限循环后给我一个500。我不希望任何重写发生。怎么了?

1 个答案:

答案 0 :(得分:0)

您在请求URI表达式中缺少前导/,您也应该转义internal.php中的点以使其实际匹配点而不是每个字符:

RewriteCond %{REQUEST_URI} !^/(static/|server/|internal\.php).*$
RewriteRule ^(.*)$ /internal.php?request=$1 [L]

请注意,如果您想避免例如添加其他条件,这也会重写/static/server,其中省略了尾部斜杠:

RewriteCond %{REQUEST_URI} !^/(static|server)$
RewriteCond %{REQUEST_URI} !^/(static/|server/|internal\.php).*$

应该可以将它放在一个表达式中,但是我对正则表达式并不熟悉,所以我很确定这不是最优雅的方式:

RewriteCond %{REQUEST_URI} !^/(((static|server)(/.*)?)|(internal\.php.*))$