我有一个使用Apache重写模块的站点。问题是我正在使用RewriteRule:
RewriteRule ^([^/]+)/?$ /index.php?p1=$1 [L]
我需要匹配除“/”之外的所有字符,但它不起作用。它计算出一个错误“在此服务器上找不到请求的URL。”
它符合这条规则:
RewriteRule ^([^/\.]+)/?$ /index.php?p1=$1 [L]
但是此规则与“点”不匹配,因此每当网址有“点”时,它将与上面相同。
请帮忙
答案 0 :(得分:1)
RewriteRule ^([^/]+)/?$ /index.php?p1=$1 [L]
无效的原因是因为存在内部重定向循环,假设您收到了请求/zoo
:
zoo
(此处没有前导斜杠)匹配^([^/]+)/?$
,并且网址被重写为/index.php?p1=zoo
zoo
和/index.php
不同,因此内部重定向,并再次应用规则,导致斜杠剥离index.php
匹配^([^/]+)/?$
,会被重写为/index.php?p1=index.php
index.php
和/index.php
不同,因此内部重定向您可以停止循环的一种方法是将规则更改为:
RewriteRule ^([^/]+)/?$ index.php?p1=$1 [L]
这样index.php
将匹配index.php
(没有前导斜杠),但更好的方法是添加一些重写条件:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
在重写规则面前。