我想使用一个相当简单的重写,如下所示:
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]
答案 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'?)