1

私のローカル テスト マシンでは問題なく動作しますが、サーバーでは GET パラメータが 2 倍になります。

たとえば、次のコードを使用します。

return redirect('/add?c='+str(rm.id))

たとえば、 /add?c=3423?c=3423 になります。

return redirect('/add?success')

/add?success?success に移動します

何が起きているか知っている人はいますか?

編集:ここに関連するurls.pyの行と私のnginx構成があります

url(r'^add/$', 'rumors.views.add'),

server{
    listen 0.0.0.0:443 ssl;
    server_name www.****.com ****.com;
    ssl_certificate     /opt/etc/***;
    ssl_certificate_key /opt/etc/***;

    keepalive_timeout 70;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    location / {
        auth_basic "Restricted";
        auth_basic_user_file /opt/etc/.htpasswd;
        uwsgi_pass   unix:///tmp/uwsgi_***.sock;
        include        uwsgi_params;
    }

    location /static {
            # Point this wherever the static files for your django app are stored (i.e. MEDIA_ROOT)
            alias /opt/apps/****/static;
    }

}
server {
listen 80 default_server;
server_name "";


location / {
    rewrite ^ https://****.com$request_uri permanent;
}
}
4

1 に答える 1

2

まだ十分な情報を知らずに、これをランダムに突き刺します...

何が起こっているかは、最初のリクエストが Web サーバーを経由して django に送られる可能性があります。Django はクエリ文字列を含む新しい URL にリダイレクトし、リクエストは Web サーバーを再度通過します。その時点で、Web サーバーがパターンを不適切に分割していると思います。通常、これを見ると、Web サーバーはパターンの末尾にスラッシュを表示して、URL パターン全体をそのまま処理する必要があることを通知します。

だから多分これを試してください(末尾のスラッシュを追加してください):

return redirect('/add/?c='+str(rm.id))

return redirect('/add/?success')

これ以外に、本番 Web サーバーについてさらに詳しく調べる必要がある場合があります。

運用サーバーが実際にリダイレクトを実行していて、django ではない場合は、ルールに末尾のスラッシュが存在することを確認する必要があります。

更新: 追加された nginx conf に基づく

あなたの問題は、https の書き換えルールである可能性があると思います。単一の欠落のためにクエリ文字列を再追加する可能性が非常に高い?

http://wiki.nginx.org/HttpRewriteModule

置換引数の行に示されている場合、残りの要求引数がそれらに追加されます。それらが追加されないようにするには、最後の文字として疑問符を配置します。

rewrite ^/users/(.*)$ /show?user=$1? last;

nginx conf で次の変更を行ってみてください。

location / {
    rewrite ^ https://****.com$request_uri? permanent;
}

最後に、https リダイレクトの動作に関するコメントに対処するために、それも調整することをお勧めします。私は実際、私のサーバーの1つでほぼ同じことをしています。しかし、ssl サーバーをデフォルトにし、ポート 80 サーバーで location ディレクティブを使用しません。

server {
        server_name www.foo.com foo.com;
        rewrite ^ https://$host$request_uri? permanent; 
}

server {
        listen 443 default_server ssl;
        ...
}
于 2012-06-27T19:18:08.117 に答える