1

POST を介して入力を受け取り、リダイレクトする検索ページがある Django プロジェクトがあり/search/<search string>/、このページが結果をレンダリングします。パーセント記号 (%) は検索でワイルドカードとして使用され (tes%er は testuser、tester などを返し、URL は次のようになります: example.com/search/tes%25er/)、すべて Django 開発サーバーで正常に動作します。URL に手動で 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.。エンコードされた % 記号のように、URL に「25」を手動で追加すると、開発サーバーのように見え、正常に動作します。

Apache が %-sign を自動的にエスケープして機能する URL を作成する方法はありますか? % エスケープされていないことを理解するか、URL を作成する検索ページで醜いハックを行う必要がありますか? (このような醜いハックはしたくないので、ユーザーは手動で % を URL に追加して動作させることができません)。

編集: 検索ページから検索 URL にクエリを送信するコード。

if form.is_valid():
    if 'search_user' in request.POST:
        q = request.POST['search_user']
        return redirect('/search/'+q)
4

1 に答える 1

1

Ignacio が既に提案したように、無効な URL にリダイレクトしないでください。あなたの質問に答えるには:

Apache サーバーに URL をエスケープするように要求することはできません (または、「すべき」と言った方が適切かもしれません)。URL をエスケープする理由は、一部の文字には別の意味があるためです。たとえば、次のクエリ文字列を使用します。

somedomain.com/?キー=値

?値に aまたは aを使用したい場合=、クエリ文字列の演算子を使用しているとサーバーが判断するため、問題が発生します。

- 記号についても同様です%。あなたの apache サーバーが %-symbol を見ると、彼はエンコードされたものを見つけ、それをデコードしようとします。クエリ文字列が の場合%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=%;と入力したらどうなるでしょうか? その場合、無効なアドレスを入力したため、問題が発生することになります。

お役に立てれば :-)。

ウート

于 2012-05-11T14:14:55.033 に答える