我需要實作下面給出的這張地圖:
https://www.domain1.com/open.html?cuSDyh&utm_medium=rep-email
to
https://www.domain2.com/c/cuSDyh?utm_medium=rep-email
我撰寫了一個重寫規則來實作這一點,這似乎是錯誤的“?” 最終結果不會被替換。
RewriteRule ^/open.html?(.*)$ https://www.domain2.com/c/$1 [NC,R=301,L]
誰能幫我找到正確的重寫規則?
uj5u.com熱心網友回復:
RewriteRule ^/open.html?(.*)$ https://www.domain2.com/c/$1 [NC,R=301,L]
這里有幾個問題會阻止規則起作用:
RewriteRule模式(第一個引數)僅與 URL 路徑匹配,特別是不包括查詢字串。要匹配查詢字串,您需要一個附加條件(RewriteCond指令)并匹配QUERY_STRING服務器變數。RewriteRule模式匹配的 URL 路徑不以斜杠開頭。
請注意,該RewriteRule 模式是一個正則運算式。上述正則運算式中未轉義?的字符是一個特殊的元字符(一個量詞),它使前面的標記成為可選的。因此,在您的示例中, thel是可選的。(盡管無論如何你都匹配后面的每一個,所以?完全是多余的。)
FROM: /open.html?cuSDyh&utm_medium=rep-email TO: /c/cuSDyh?utm_medium=rep-email
我假設第一個 URL 引數(例如,cuSDyh在您的示例中)僅由字母(小寫或大寫)組成,而不是 name=value 對(根據您的示例)。第一個 URL 引數后面可以有 0 個或多個 URL 引數。
請嘗試以下操作:
RewriteCond %{QUERY_STRING} ^([a-z] )(?:&|$)(.*) [NC]
RewriteRule ^open\.html$ /c/%1?%2 [NE,R=302,L]
和反向參考%1與%2前面的CondPattern中捕獲的子組匹配。IE。%1匹配第一個 URL 引數(例如cuSDyh在您的示例中)并%2匹配所有后續 URL 引數,不包括分隔符。
指令中需要NE標志 (not NC)RewriteRule以防止 URL 的查詢字串部分在重定向回應中被雙重 URL 編碼。(該QUERY_STRING變數已經經過 URL 編碼。)
如果在第一個之后沒有額外的 URL 引數,那么上述規則本質上將附加一個空查詢字串(由尾隨 表示?)。但是,?Apache 在重定向回應中會自動洗掉尾隨。
為避免潛在的快取問題,請始終先使用 302(臨時)重定向進行測驗,并且僅在測驗完成后更改為 301(永久)重定向(如果這是有意的話)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/505668.html
