Apache mod_rewrite结束时段

时间:2012-06-21 18:03:00

标签: regex .htaccess mod-rewrite

我正在努力更好地理解Apache的mod_rewrite,并且我有意想不到的结果。我尝试了许多不同的表达方式,但似乎没有任何表现我应该理解它。

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l

RewriteRule ^(.*)$ index.php?route=$1 [QSA,L]

使用www.domain.com/item1/item2/item3会产生item1/item2/item3
使用www.domain.com/item1/item2/item3.php会产生item1/item2/item3.php
使用www.domain.com/item1/item2/item3...........会产生item1/item2/item3

为什么不是item1/item2/item3...........

奇怪的是,如果网址为www.domain.com/item1/item2/item3..........a,则路线符合我的预期,item1/item2/item3..........a

我尝试过其他一些正则表达式,但它们的行为相似。

谢谢。

2 个答案:

答案 0 :(得分:1)

虽然我还没有找到任何解释为什么Apache / .htaccess / mod_rewrite以这种方式行事的文档,但我确实有其他选择,以防有人遇到此问题。

不是使用.htaccess将请求的文件名传递给查询字符串变量,如上面的问题中的route,在PHP中有一些可以使用的服务器变量。所以,我将index.php中的逻辑从读取查询字符串改为:

trim( $_SERVER['REDIRECT_URL'], "/" );

REDIRECT_URL(和REQUEST_URI)服务器变量将保留尾随点,修剪将获得前导斜杠和尾随斜杠,类似于重写规则所发生的情况。

答案 1 :(得分:1)

我遇到了同样的问题,它似乎是Windows平台上的Apache的一个错误。但是,它适用于Linux。

https://issues.apache.org/bugzilla/show_bug.cgi?id=48687