[英]Correct escaping of % in the URL with Apache
我有一個Django項目,其中有一個搜索頁面,該頁面通過POST接收輸入並重定向到/search/<search string>/
並且此頁面呈現結果。 百分號(%)在搜索中用作通配符(tes%er返回testuser,tester等,然后url如下所示: example.com/search/tes%25er/
),並且一切都可以在Django上正常運行開發服務器。 如果我在網址中手動寫入tes%er,它將自動更改為tes%25er。
現在,我使用mod_wsgi在Apache服務器上進行部署,當我的搜索頁面重定向到example.com/search/tes%er/
我收到服務器錯誤: Bad Request. Your browser sent a request that this server could not understand.
Bad Request. Your browser sent a request that this server could not understand.
。 如果我在網址中手動添加“ 25”(如編碼的%符號),則它看起來像開發服務器一樣,可以正常工作。
Apache是否有一種方法可以自動轉義%符號並創建可以正常工作的url,了解未轉義的%,或者我需要在構建該URL的搜索頁面中進行難看的修改? (我不想像這樣造成丑陋的駭客,然后用戶無法將%手動添加到url並使其正常工作)。
編輯 :將查詢從搜索頁面發送到搜索URL的代碼。
if form.is_valid():
if 'search_user' in request.POST:
q = request.POST['search_user']
return redirect('/search/'+q)
正如Ignacio所建議的那樣,您不應重定向到無效的URL。 因此,回答您的問題:
您可以(或者最好說“應該”)不要求您的Apache服務器轉義您的URL。 逃脫URL的原因是因為某些字符還有其他含義。 例如,使用一個查詢字符串:
somedomain.com/?key=value
如果我們想使用?
或=
值,則可能會出現問題,因為服務器會認為您正在使用查詢字符串的運算符。
%
符號相同。 當您的apache服務器看到%符號時,他認為他會找到一個encond並將嘗試對其進行解碼。 如果您的查詢字符串是%20
,則apache會將其轉換為空格,而您的意思是“ wildcard20”。
總結:apache解碼您的字符串,因此您不希望他對它進行編碼。
但這不能解決您的問題。 您可以通過將代碼更改為以下內容來解決問題:
from urllib import urlencode
if form.is_valid():
if 'search_user' in request.POST:
q = request.POST['search_user']
return redirect('/search/?q='+urlencode(q))
如果您想知道:如果我的用戶輸入/search/?q=%
,該/search/?q=%
在這種情況下,他會遇到問題,因為他輸入了無效的地址。
希望這可以幫助 :-)。
Wout
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.