2

我试图更好地理解 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...........

奇怪的是,如果 URL 是www.domain.com/item1/item2/item3..........a,那么路由就是我所期望的,item1/item2/item3..........a

我尝试了其他一些正则表达式,但它们的作用相似。

谢谢你。

4

2 回答 2

1

虽然我还没有找到任何文档来解释为什么 Apache/.htaccess/mod_rewrite 会以这种方式运行,但我确实有一个替代方案,以防万一有人遇到这种情况。

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

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

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

于 2012-06-22T13:52:38.327 回答
1

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

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

于 2012-07-15T13:25:47.127 回答