簡體   English   中英

使用Apache正確轉義URL中的%

[英]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

正確

[英]Correct <form action=“ ” URL for a SessionWizardView

暫無
暫無

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

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