我想通過檢索 ID 引數將 url 重定向到新域,但只取前 4 個字符。有人知道怎么做嗎?
例如,原始網址:
http://www.original.example/see/news/actualite.php?newsId=be9e836&newsTitle="blablabla"
至 :
https://www.new.example/actualites/be9e
我已經測驗過:
RewriteCond %{QUERY_STRING} ^newsId=(.*)$ [NC]
RewriteRule ^$ https://www.new.example/actualites/%1? [NC,L,R]
uj5u.com熱心網友回復:
RewriteCond %{QUERY_STRING} ^newsId=(.*)$ [NC] RewriteRule ^$ https://www.new.example/actualites/%1? [NC,L,R]
這有幾個問題:
模式中的正則運算式
^$僅匹配檔案根。您示例中的 URL 是- 所以這個規則永遠不會匹配(并且條件永遠不會被處理)。RewriteRule/see/news/actualite.php正則運算式
^newsId=(.*)$正在捕獲 之后的所有內容newsId=,包括任何其他 URL 引數。您只需要此特定 URL 引數的前 4 個字符。
順便說一句,您現有的條件取決于是否newsId是第一個 URL 引數。也許總是這樣,也許不是。但是不管順序如何,檢查這個 URL 引數是相對簡單的。
另外,您需要不區分大小寫的匹配嗎?還是總是newsId如您的示例中所述。僅在NC必要時使用該標志,而不是作為默認值。
請嘗試以下操作:
RewriteCond %{QUERY_STRING} (?:^|&)newsId=([^&]{4})
RewriteRule ^see/news/actualite\.php$ https://www.new.example/actualites/%1 [QSD,R,L]
%1反向參考現在只包含 URL 引數值的前 4 個字符(newsId即非&字符),如 regex 所示([^&]{4})。
該QSD標志(Apache 2.4)從重定向回應中丟棄原始查詢字串。無需像在早期版本的 Apache 中所要求的那樣,在替換字串后面附加?(一個空的查詢字串)。
更新:
我在鏈接
#末尾添加了一個錨鏈接 ( ),是否有可能將其洗掉以創建一個干凈的鏈接?例如,目前我有:https://www.new.example/news/4565/#title理想情況下:https://www.new.example/news/4565
這里的“問題”是瀏覽器管理“片段識別符號”(fragid)(即“錨鏈接(#)”)并通過重定向保留它。換句話說,瀏覽器將脆弱的內容重新附加到來自服務器的重定向回應中。fragid 永遠不會發送到服務器,因此我們無法在發出 HTTP 重定向之前檢測到此服務器端。
我們唯一能做的就是附加一個空的片段(即尾隨#),希望瀏覽器丟棄原始片段。不幸的是,您最終可能會#在重定向的 URL 上出現尾隨(取決于瀏覽器)。
例如(簡化):
:
RewriteRule .... https://example.com/# [R=301,NE,L]
請注意,您需要在NE此處使用該標志來防止 Apache#對重定向回應中的 URL 進行編碼。
就像我上面說的,瀏覽器可能會以不同的方式處理這個問題。
進一步閱讀:
- URL 片段和 302 重定向
- 重定向保持哈希
- 如何清除 302 重定向上的片段識別符號?
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/505686.html
