重写模块,不能匹配点字符?

时间:2011-11-03 03:44:02

标签: regex apache mod-rewrite

我有一个使用Apache重写模块的站点。问题是我正在使用RewriteRule:

RewriteRule ^([^/]+)/?$ /index.php?p1=$1 [L]

我需要匹配除“/”之外的所有字符,但它不起作用。它计算出一个错误“在此服务器上找不到请求的URL。”

它符合这条规则:

RewriteRule ^([^/\.]+)/?$ /index.php?p1=$1 [L]

但是此规则与“点”不匹配,因此每当网址有“点”时,它将与上面相同。

请帮忙

1 个答案:

答案 0 :(得分:1)

RewriteRule ^([^/]+)/?$ /index.php?p1=$1 [L]

无效的原因是因为存在内部重定向循环,假设您收到了请求/zoo

  1. zoo(此处没有前导斜杠)匹配^([^/]+)/?$,并且网址被重写为/index.php?p1=zoo
  2. zoo/index.php不同,因此内部重定向,并再次应用规则,导致斜杠剥离
  3. index.php匹配^([^/]+)/?$,会被重写为/index.php?p1=index.php
  4. index.php/index.php不同,因此内部重定向
  5. 重复3和4
  6. 您可以停止循环的一种方法是将规则更改为:

    RewriteRule ^([^/]+)/?$ index.php?p1=$1 [L]
    

    这样index.php将匹配index.php(没有前导斜杠),但更好的方法是添加一些重写条件:

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

    在重写规则面前。