2012-03-09 42 views
0

我想用一個非常簡單的重寫,像這樣:htaccess的重寫我發瘋

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

但預期它不工作,去喜歡的index.php/monitor.html(這踢在symfony中的路由,並返回404錯誤,但是這是一個不同的故事)
但是如果我包括完整的URL:

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

它的響應正確的內容,但是這看起來像一個完整的重定向,該rewrited網址是在瀏覽器中顯示。那不是透明的,也不容易部署。
我在這裏錯過了什麼?

htaccess的文件的其餘部分,如果它的事項:

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

在你提出的規則之前或之後是「休息」嗎? – CyberDude 2012-03-09 08:43:37

+0

之後。有問題的規則是第一個。 – posthy 2012-03-09 09:51:59

+0

當然是在docroot中。 – posthy 2012-03-09 10:12:25

回答

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'?)