2010-09-14 73 views
1

我有我通过路由所有请求的引导php文件:mod_rewrite链接?

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

说我有一个像/书籍网址/白鲸家伙,但我需要的URL来传递给像/书籍的索引文件/细节/白鲸迪克。在最后一个RewriteRule之前,有没有办法“重写”/ books/moby-dick到/ books/detail/moby-dick?我认为Chain [C]旗会做到这一点,但我最终得到了“书/细节/ moby-dick/moby-dick”。这里就是我目前坚持:

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

回答

1

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

RewriteRule ^books/([A-Za-z0-9\-]+)$ books/detail/$1 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ index.php?query=$1 [L] 

请注意,如果你链的规则一起,如果请求路径不匹配第一条规则,请求不会被重定向到引导文件。

这些都不是实际问题的原因。会发生什么是Apache已经决定请求具有路径信息(出于我将不得不考虑的原因),并且在重写之后它会自动将结果追加到结果中。假设的“路径信息”是/moby-dick,这就是它出现两次的原因。

幸运的是,既然我们不想要它,我们可以用DPI flag来丢弃它。记住以上几点,下面将请求重定向到books/moby-dickindex.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的假设,虽然你也提到books/view/name

+0

DPI看起来像什么,我一直在寻找。很好的答案! – typeoneerror 2010-09-15 00:39:26

0

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

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

的标准技术,以避免大规模的循环和老年.htaccess文件重复的问题是要在顶部加了一点的样板,像

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