[英]htaccess: remove URL parameter from query string with missing value?
我想重定向:
https://www.example.com/?p2
到https://www.example.com/
https://www.example.com/?p1=v1&p2&p3=v3
到https://www.example.com/?p1=v1&p3=v3
https://www.example.com/page.php?p4=v4&p2
到https://www.example.com/page.php?p4=v4
您可以假設缺少該值的查詢字符串始終是p2
,如果這樣可以更輕松地回答問題。
但是p2
查詢字符串不會總是缺少值,在那些情況下我不希望它被刪除。
.htaccess
修復你可以在.htaccess
中用一堆不同的方式重寫......
示例 1:
RewriteCond %{QUERY_STRING} ^p2$
RewriteRule . / [QSD,L]
RewriteCond %{QUERY_STRING} ^(.+)&p2$
RewriteRule . /?%1 [L]
RewriteCond %{QUERY_STRING} ^p2&(.+)$
RewriteRule . /?%1 [L]
RewriteCond %{QUERY_STRING} ^(.+)&p2(&.+)$
RewriteRule . /?%1%2 [L]
示例 2:
RewriteCond %{QUERY_STRING} (^|.*&)p2(&.*|$)
RewriteRule . /?%1%2 [L]
// This doesn't give particularly clean query strings (not that they need to
// be for the server to understand it).
// e.g.
// ?p1=v1&p2&p3=v3 -> ?p1=v1&&p3=v3
示例 3:
RewriteCond %{QUERY_STRING} (^|.*&)p2(?:&(.*)|$)
RewriteRule . /test.php?%1%2 [L]
// ?p2&p3=v3 -> ?p3=v3
// ?p1=v1&p2 -> ?p1=v1
// ?p1=v1&p2&p3=v3 -> ?p1=v1&p3=v3
“這也利用了 mod_rewrite “功能”,在分配給位置 HTTP 響應 header 之前,結果查詢字符串上的尾隨 & 被自動截斷/刪除。” @懷特先生
正如@MrWhite指出尾隨&
被截斷的那樣,考慮到這一點,您可以將上面的內容用作一行條件來捕獲所有可能性(示例輸入和 output 在注釋行//...
中提供)。
雖然您可以如上所示更改查詢字符串,但是當您可以在腳本中輕松處理它時(例如PHP
),這樣做真的沒有意義:
if(empty($_GET["p2"])){
unset($_GET["p2"]);
}
無論如何你必須做些什么來處理你頁面上的查詢字符串?!
補充說明
上面的規則默默地刪除了查詢字符串。 如果您想讓用戶知道,那么您應該按照@MrWhite 的回答使用適當的 HTTP 響應代碼設置標志[R=30X]
進行重定向:
在.htaccess
中執行此操作的另一種方法......
RewriteCond %{QUERY_STRING} ^&?p2(?:&|$)(.*) [OR]
RewriteCond %{QUERY_STRING} (.+)&p2(&.*|$)
RewriteRule ^ %{REQUEST_URI}?%1%2 [R=302,L]
在其他重寫之前,這應該是 go 靠近.htaccess
文件的頂部。
這會處理p2
URL 參數(無值)的所有查詢字符串變體,並生成“干凈”的查詢字符串。 URL 已通過外部重定向“更正”。 (首先使用 302 - 臨時 - 重定向進行測試,然后再更改為 301 - 永久 - 如果這是意圖,以避免潛在的緩存問題。)
只有兩個 OR 條件之一匹配。 第一個條件處理p2
出現在查詢字符串開頭的情況。 第二個條件處理p2
稍后出現或出現在查詢字符串末尾的情況。 這樣我們就不會在生成的替換中得到不匹配或雙&
(URL 參數定界符)。
%1
和%2
反向引用包含來自最后一個匹配的 CondPattern(無論哪個)的第一個和第二個捕獲組。 基本上是p2
參數前后的字符串。
這也利用了 mod_rewrite “功能”,其中結果查詢字符串的尾隨&
在分配給Location
HTTP 響應 header之前會自動截斷/刪除。
然而,正如已經提到的,根據這個“錯誤的” p2
URL 的流行程度以及它出現的位置,最好簡單地“忽略”它並確保你在你的文件中設置了適當的rel="canonical"
元素HTML。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.