簡體   English   中英

htaccess:從缺少值的查詢字符串中刪除 URL 參數?

[英]htaccess: remove URL parameter from query string with missing value?

我想重定向:

  • https://www.example.com/?p2https://www.example.com/

  • https://www.example.com/?p1=v1&p2&p3=v3https://www.example.com/?p1=v1&p3=v3

  • https://www.example.com/page.php?p4=v4&p2https://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]進行重定向:

https://developer.mozilla.org/en-US/docs/Web/HTTP/Status

.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM