[英]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
)替換為+
(替代編碼),則可以這樣做:
假設:
%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 參數值中的+
替換。 N
( next
)標志使規則集從頂部重新開始。 在 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.