2016-03-29 79 views
1

爲什麼:現代重寫-l標誌不停止

http://example.com/robots.txt 

重定向到:

http://www.example.com/mvc/view/robots/live-robots.txt 

本規則:

RewriteEngine On 
RewriteBase/
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com 
RewriteRule ^robots.txt /mvc/view/robots/live-robots.txt [L] 
#.... 20 irrelevant lines for mobile rewrites 
# Force the "www." 
RewriteCond %{HTTP_HOST} ^example\.com$ [NC] 
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L] 

裝載然而,這:

http://www.example.com/robots.txt 

按預期重寫live-robots.txt

不應該L標誌停止在這兩種情況下的重定向,並沒有得到後者的規則?

在這種情況下,L標誌可以用來結束當前一輪的mod_rewrite處理。

https://httpd.apache.org/docs/current/rewrite/flags.html

當前執行路徑:

  1. http://example.com/robots.txt
  2. 301供應
  3. http://www.example.com/ mvc/view/robots/live-robots.txt

然後

  1. http://www.example.com/robots.txt
  2. 200(MVC /視圖/機器人/活的robots.txt的內容供應)

我敢肯定它不是一個正則表達式的問題,但這裏也是測試,https://regex101.com/r/eI9aC4/1

+0

什麼你改寫日誌是什麼樣子? – larsks

+0

從訪問日誌中還是有重寫特定日誌的地方?訪問日誌具有'80 GET /robots.txt 301',然後 '80 GET /mvc/view/robots/live-robots.txt 304'。 – chris85

+1

查看[文檔](http://httpd.apache.org/docs/current/mod/mod_rewrite.html#logging)(或[here](http://httpd.apache.org/docs/) 2.2/mod/mod_rewrite.html#rewritelog)for Apache 2.2)。 – larsks

回答

1

標記L不會停止執行其他規則。它僅在while循環中充當continue,並使mod_rewrite循環再次運行。

您的規則需要按順序顛倒。一般在內部重寫之前保留重定向規則:

RewriteEngine On 
RewriteBase/

# Force the "www." 
RewriteCond %{HTTP_HOST} ^example\.com$ [NC] 
RewriteRule^http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NE] 

RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC] 
RewriteRule ^robots\.txt$ mvc/view/robots/live-robots.txt [L,NC] 
#.... 20 irrelevant lines for mobile rewrites 

請確保清除您的瀏覽器緩存以進行此更改。

不過,如果你的Apache 2.4及以上,那麼你可以使用END標誌完全停止下面的所有規則:

RewriteRule ^robots\.txt$ mvc/view/robots/live-robots.txt [END] 
+0

我正在運行2.2.15,所以'結束'不適用於我。 2.2中沒有辦法明確讓文件停止處理? – chris85

+0

沒有從Apache 2.4+開始添加'END'。對於'2.2',我應該在重寫規則之前保留重定向規則。 – anubhava

+1

謝謝,這回答了這個問題。在考慮升級到2.4。 – chris85