mod_rewrite链接?

时间:2010-09-14 04:00:49

标签: php apache mod-rewrite

我有一个bootstrap php文件,我通过以下方式路由所有请求:

RewriteRule ^(.*)$ index.php?query=$1 [L]

假设我有一个像/ books / moby-dick这样的网址,但我需要将URL传递给索引文件,例如/ books / detail / moby-dick。有没有办法在最后一次RewriteRule之前“重写”/ books / moby-dick到/ books / detail / moby-dick?我认为Chain [C]旗会做到这一点,但我最终得到了“books / detail / moby-dick / moby-dick”。这就是我目前所处的位置:

RewriteRule ^books/([A-Za-z0-9\-]+)$ books/detail/$1 [C]
RewriteRule ^(.*)$ index.php?query=$1 [L]

2 个答案:

答案 0 :(得分:2)

您执行的任何重写都将自动向下流向规则集中的后续规则,前提是您不会导致进程以L结束/重新启动(在{{1}中使用时通常会重新启动) })或.htaccess标志。你可以删除链接,它仍然可以工作,虽然在这种情况下你必须调整第二个规则:

N

请注意,如果您 将规则链接在一起,如果请求路径与第一条规则不匹配,则请求将不会重定向到引导程序文件。

但这些都不是导致实际问题的原因。会发生什么事情是Apache已经确定请求有路径信息(由于我必须查看的原因),并且在重写之后它会自动将其附加到结果中。假设的“路径信息”是RewriteRule ^books/([A-Za-z0-9\-]+)$ books/detail/$1 RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?query=$1 [L] ,这就是它最终出现两次的原因。

幸运的是,由于我们首先不想要它,我们可以用DPI flag丢弃它。牢记以上几点,以下内容会将请求重定向到/moby-dickbooks/moby-dick

index.php?query=books/detail/moby-dick

(我做了你想要的假设RewriteRule ^books/([A-Za-z0-9\-]+)$ books/detail/$1 [DPI] RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?query=$1 [L] ,虽然你也提到了books/detail/name

答案 1 :(得分:0)

在.htaccess规则中(与httpd.conf中的相同规则不同),[L]标志从顶部开始。您可能真的想使用[END]标志(但只有​​更高版本的Apache支持它)。我相信你重复更改的原因与[C]标志无关,而是因为该行正在执行两次。 (事实上​​,唯一能让你摆脱“无限循环”的事情就是你的“-f”测试最终阻止了事情)。

.htaccess文件中的每个修改都始终“传递”到下一行(没有标志可以启用或禁用此行为)。很少使用的[C]标志似乎主要用于嵌套条件和一些尴尬的if-then-else结构的非常简单的简化,你在这个例子中都没有这样做。这就是为什么我不明白你需要[C]标志的原因。

避免大量循环并在旧的.htaccess文件中重复出现问题的标准技术是在顶部添加一些样板,如

RewriteCond %{ENV:REDIRECT_STATUS} !^[ /]*$
RewriteRule ^ - [L]