1

在我的本地测试机器上它工作正常,但在服务器上它会加倍 GET 参数。

例如,使用以下代码:

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 服务器不正确地拆分模式。通常,当我看到这个时,网络服务器希望看到模式上的尾部斜杠,以通知它应该将整个 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 重定向行为的评论,我认为您可能也需要调整它。我实际上在我的一台服务器上做了几乎完全相同的事情。但是我将 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 回答