2011-10-18 68 views
1

這是我到目前爲止。第一部分工作,但不是重定向本身。簡單301重定向變量不工作,爲什麼?

我需要做些什麼才能使它工作?

RewriteEngine On 
RewriteRule ^([^/\.]+)/?$ page.php?name=$1 [L] 

RewriteRule ^page.php?name=([^/\.]+)/?$ /$1 [R=301,L] 

此外,如果我有多個這些規則,我只在最後一個離開[L]

+5

「L」表示「最後」或「停止處理」。你的第一條規則即將捕獲大部分(如果不是全部的話)網址,因此第二條規則將很少到達,如果有的話。 –

+0

感謝您的信息。 – checkenginelight

回答

1

除了第一條規則覆蓋第二條規則之外,第二條規則也不起作用,因爲您試圖在RewriteRule中匹配查詢字符串。嘗試這樣的事情,而不是:

RewriteEngine On 
RewriteBase/

RewriteCond %{QUERY_STRING} ^name=([^/.&]+)/?$ 
RewriteCond %{ENV:REDIRECT_LOOP} !1 
RewriteRule ^page\.php$ /%1? [NS,R=301,L] 

RewriteRule ^([^/.]+)/?$ page.php?name=$1 [NS,QSA,E=LOOP:1] 

(我包括QSA標誌,以便像/foobar?foo=bar的URL將被改寫爲/page.php?name=foobar&foo=bar,而不是僅僅/page.php?name=foobar如果你不希望出現這種情況,離開它。)


注意:第二個RewriteCond是在第二個匹配後保持第一個規則不再匹配。問題是,在.htaccess上下文中,mod_rewrite或多或少地起作用,就好像所有規則都具有PT標誌,導致規則集在每次重寫後從頭開始重新運行,甚至是內部規則。或者,to quote the documentation

「如果你在任何.htaccess文件或目錄<部分>使用重寫規則,它具有的規則是如何處理一些瞭解是非常重要的這樣做的簡化形式是,一旦規則已經被處理,重寫的請求被交還給URL解析引擎,以完成它可能的操作,可能在處理重寫的請求時,可能會再次遇到.htaccess文件或目錄>部分,因此規則集可能會從頭開始重新運行,如果其中一個規則導致重定向 - 無論是內部還是外部 - 都會導致請求進程重新開始,這通常會發生。「

我使用的解決方法是在內部重寫觸發時設置一個自定義環境變量E=LOOP:1,並在執行外部重寫之前檢查它。請注意,在內部重寫之後請求處理重新啓動時,Apache將在前一遍中設置的所有環境變量的名稱預先設置REDIRECT_,因此即使我們設置的變量僅命名爲LOOP,我們需要檢查的變量爲REDIRECT_LOOP