我正在努力更好地理解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
我尝试过其他一些正则表达式,但它们的行为相似。
谢谢。
答案 0 :(得分:1)
虽然我还没有找到任何解释为什么Apache / .htaccess / mod_rewrite以这种方式行事的文档,但我确实有其他选择,以防有人遇到此问题。
不是使用.htaccess将请求的文件名传递给查询字符串变量,如上面的问题中的route
,在PHP中有一些可以使用的服务器变量。所以,我将index.php中的逻辑从读取查询字符串改为:
trim( $_SERVER['REDIRECT_URL'], "/" );
REDIRECT_URL(和REQUEST_URI)服务器变量将保留尾随点,修剪将获得前导斜杠和尾随斜杠,类似于重写规则所发生的情况。
答案 1 :(得分:1)
我遇到了同样的问题,它似乎是Windows平台上的Apache的一个错误。但是,它适用于Linux。