簡體   English   中英

用 .htaccess 中的 + 替換 URL 編碼 (%20)

[英]Replacing URL encoding (%20) with + in .htaccess

這是我到目前為止所得到的,它適用於重定向單個關鍵字,但如果 URL 包含 URL 編碼空間 (%20),則效果不佳。

RewriteCond %{QUERY_STRING} (?:^|&)search=([^&]+) [NC]
RewriteRule ^jobs/?$ /?s=%1 [L,NC,R=301]

我想做的是將%20更改為+

例如,假設我有以下 URL:

http://www.example.com/jobs/?search=first%20second

我想將其重定向到以下內容:

http://www.example.com/?s=first+second

謝謝

...但如果 URL 包含 URL 編碼空間 (%20),則效果不佳。

 RewriteCond %{QUERY_STRING} (?:^|&)search=([^&]+) [NC] RewriteRule ^jobs/?$ /?s=%1 [L,NC,R=301]

由於QUERY_STRING已經是 URL 編碼的,您需要在RewriteRule指令中包含NE ( noescape ) 標志以防止任何 URL 編碼的字符串被雙重編碼。 這不僅適用於空格(即%20%2520 ),也適用於許多其他非字母數字字符。

例如:

RewriteRule ^jobs/?$ /?s=%1 [NE,L,NC,R=301]

你還需要用+替換%20嗎? 查詢字符串中的空格是 URL 編碼為%20還是+對接收應用程序來說並不重要。 兩者都將作為文字空間進行 URL 解碼。

注意:只有在查詢字符串中,空格才能被 URL 編碼為+ 在 URL 的其他部分, +被視為文字字符(加號)。

search URL 參數值中用+替換%20

如果要將search URL 參數值中的所有 % 編碼空格(即%20 )替換為+ (替代編碼),則可以這樣做:

假設:

  • 只對“搜索”URL 參數感興趣,因為您目前正在丟棄所有其他 URL 參數。
  • 可以有任意數量的 % 編碼空格,即。 %20 ,在 URL 參數值中。

例如:

# Replace all "%20" in the "search" URL parameter with "+"
# eg. "/jobs?search=foo%20bar%20baz%20pop" to "/jobs?search=foo+bar+baz+pop"
RewriteCond %{QUERY_STRING} (?:^|&)(search)=([^&]*)%20([^&]*) [NC]
RewriteRule ^jobs/?$ $0?%1=%2+%3 [N]

# Redirect "/jobs/?search=<foo>" to "/?s=<foo>"
# (Unchanged from original redirect)
RewriteCond %{QUERY_STRING} (?:^|&)search=([^&]+) [NC]
RewriteRule ^jobs/?$ /?s=%1 [NC,NE,R=302,L]

第一條規則在內部重復循環,直到所有出現的%20都被 URL 參數值中的+替換。 Nnext )標志使規則集從頂部重新開始。 在 Apache 2.4+ 上,您可以設置迭代次數的上限(安全)限制,例如。 N=20 如果沒有%20則基本上跳過此規則(因為條件在初始調用時不匹配)。

替換字符串中的$0 (零美元)反向引用捕獲整個 URL 路徑(節省重復)。 %1 (percent-one) 反向引用僅包含“搜索”URL 參數名稱(再次保存重復) - 最后匹配的CondPattern 中的第一個捕獲組。

%2%3反向引用保存最后匹配的CondPattern 中第二個和第三個捕獲組的值,即。 前后歷時的值%20的URL參數值的字符序列。

此規則需要靠近.htaccess文件的頂部。

第二條規則與您的原始重定向指令相同,並且實際執行重定向,將 URL-path 和search URL 參數更改為s

您需要在測試前清除瀏覽器緩存,因為較早的 301(永久)重定向已被您的瀏覽器緩存。 使用 302(臨時)重定向進行測試 - 以避免緩存問題 - 只有在一切正常時才更改為 301。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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