2012-05-11 13 views
1

私はPOSTを介して入力を受け取り、/search/<search string>/にリダイレクトする検索ページを持つDjangoプロジェクトを持っており、このページは結果をレンダリングします。テストではワイルドカードとしてパーセント記号(%)が使用されています(tes%erはtestuser、testerなどを返し、URLは次のようになります:example.com/search/tes%25er/)、すべてがDjango開発サーバーで正常に動作します。手動でurlにtes%erを書き込むと、自動的にtes%25erに変更されます。ApacheでURLの%のエスケープを正しく修正しました

私はmod_wsgiでApacheサーバーにデプロイしています。検索ページがexample.com/search/tes%er/にリダイレクトされると、サーバーエラー:Bad Request. Your browser sent a request that this server could not understand.が発生します。私が手動でURLに「25」を追加すると、エンコードされた%記号のようになり、開発サーバーのように見えます。

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

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

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

なぜ最初に無効なURLにリダイレクトしていますか? –

+0

@ IgnacioVazquez-Abrams:開発サーバーが自動的にURLをエスケープすることができたので、私はApacheも同様だと考えました。 – olofom

+0

@ IgnacioVazquez-Abrams:確かに 'q = request.POST ['search_user']。replace( '%'、 '%25')'はうまくいきますが、とにかくApacheと一緒にやっています。出来ますか? – olofom

答えて

1

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

あなたのURLをエスケープするようあなたのApacheサーバに尋ねることはできません。 URLをエスケープする理由は、一部の文字に別の意味があるためです。たとえば、クエリ文字列を取る:

somedomain.com/?key=value

をあなたのサーバーがあると思うだろうので、我々はあなたが問題を持っているでしょう、あなたの価値の?または=を使用したい場合あなたのクエリ文字列の演算子を使用します。

% -symbolと同じです。あなたのApacheサーバーが%記号を見ると、彼はencondedを見つけてそれを解読しようと考えます。あなたのクエリー文字列が%20なら、あなたは "wildcard20"を意味していたのに対し、apacheはこれをスペースに変換します。

要約: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=%を入力したらどう。その場合、彼は無効な住所をタイプしたために問題を抱えています。

希望:-)。

wout

+0

私はあなたがurlencodeの代わりにquote_plus()を使うことを意図していたと思います。quote_plusが文字列をエスケープしている間、urlencodeは辞書を取ります。私はこの解決策、おかげで行くつもりです。 – olofom

関連する問題