htaccess重写让我疯了

时间:2012-03-09 08:26:22

标签: apache .htaccess mod-rewrite

我想使用一个相当简单的重写,如下所示:

RewriteRule monitor.html index.php/\?first_category_id=B008 [NC,L]

但它没有按预期工作,转到像index.php / monitor.html(它在symfony的路由中踢,并返回404错误,但这是一个不同的故事)
但是,如果我包括完整的网址,如:

RewriteRule monitor.html http://example.com/index.php/\?first_category_id=B008 [NC,L]

它会回复正确的内容,但这看起来像是一个完整的重定向,重写的网址会在浏览器中显示出来。这不透明也不易于部署 我在这里失踪了什么?

如果重要的话,htaccess文件的其余部分:

RewriteCond %{REQUEST_URI} \..+$
RewriteRule .* - [L]
RewriteRule ^(.*)$ index.php [QSA,L]

1 个答案:

答案 0 :(得分:0)

您的规则正在输出相对路径,并且您处于每个目录的上下文中。您需要RewriteBase。在每个目录的上下文中,重写是在扩展的文件系统路径上完成的,而不是在原始URL上。但扩展的结果再次转换为URL! RewriteBase提供了执行此操作所需的前缀。如果没有它,URL就会在替换之前被剥离的相同文件系统前缀中天真地产生,并且最终得到例如http://example.com/var/www/docroot/blah...,这是无意义的。 RewriteBase或者以斜杠开头的绝对值。

另外,你应该锚定比赛:

RewriteRule ^monitor.html$ ...

否则规则可能会匹配路径中间的某个位置,只有匹配的部分将替换为替换!您不希望匹配和翻译amonitor.htmly/foobar,正确,只需将monitor.html部分转换为index.php部分。

你不应该在替换中逃避问号。这不是一个正则表达式!只是index.php/?etc而不是index.php/\?etc(反斜杠是否会被搞砸,导致`index.php / monitor.html'?)