URLS 问题中的 Django 双斜杠(多个 Web 服务器、Apache 和 Nginx)

Posted

技术标签:

【中文标题】URLS 问题中的 Django 双斜杠(多个 Web 服务器、Apache 和 Nginx)【英文标题】:Django Double Slash in URLS Issue (Multiple Webservers, Apache and Nginx) 【发布时间】:2011-05-02 16:49:00 【问题描述】:

要查看示例:加载 example.com,单击链接到 /test 的链接,而不是转到 http://example.com/test/,而是转到 http://www.example。净//测试/

或者,如果您登录,自动生成的 django 管理部分的登录表单将发布到 //admin 而不是 admin。

似乎这是一个 django 问题,但我唯一改变的是 nginx

附加说明(10 月 31 日添加):

这个问题似乎与https://serverfault.com/questions/134863/nginx-fastcgi-problems-with-django-double-slashes-in-url 非常相似,但不同之处在于我在项目根目录“//admin/”与“admin//”之前添加了斜杠。那里的成功解决方案对我没有帮助。 我正在使用当前 SVN 版本的 Django。

这里是 nginx fastcgi_conf:

#fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  SCRIPT_FILENAME    $fastcgi_script_name;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

fastcgi_param  PATH_INFO          $fastcgi_script_name;

# php only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

Django 项目配置

server 
        listen  80;
        server_name www.site.net;

        location / 
            fastcgi_pass unix:/path/to/site/server.sock;
            include     fastcgi.conf;
            access_log  /var/log/nginx_django.log  main;
        

        location ^~ /admin/$ 
            fastcgi_pass unix:/path/to/site/server.sock;
            include  fastcgi.conf;
            access_log  /var/log/nginx_django.log  main;
        

        location ~* ^.+\.(mpg|avi|mp3|swf|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|txt|tar|mid|midi|wav|rtf|mpeg))
$ 
            root   /path/to/site/media;
            limit_rate 2000K;
            access_log  /var/log/nginx_django_media.log  download;
            access_log   off;
        

        location ^~ /static/ 
            root   /path/to/site;
            access_log   /var/log/nginx_django_static.log download;
            expires      30d;
        

        location /403.html 
            root   /opt/nginx;
            access_log   off;
        

        location /401.html 
            root   /opt/nginx;
            access_log   off;
        

        location /404.html 
            root   /opt/nginx;
            access_log   off;
        

        location = /_.gif 
            empty_gif;
            access_log   off;
        


【问题讨论】:

嗯..这将有助于查看 nginx 配置。 如果您还需要什么,请告诉我。 我目前的假设是 Nginx 不尊重 settings.py 中的 FORCE_SCRIPT_NAME 配置选项,而 Apache 则这样做。当我切换回来时,Apache 复制了这个问题,但是当我取消注释 FORCE_SCRIPT_NAME 参数时,这个问题就消失了。此外,您可以将其设置为垃圾,NGINX 将忽略它。 【参考方案1】:
fastcgi_param  SCRIPT_NAME        '';

这为我解决了// 的问题。

【讨论】:

以上是关于URLS 问题中的 Django 双斜杠(多个 Web 服务器、Apache 和 Nginx)的主要内容,如果未能解决你的问题,请参考以下文章

Urls.py 无法将#(pound) 字符传递给 Django 中的视图,

Django URL // 双斜杠被删除(可能是 Apache 的错)?

django网页问题 url自动添加了斜杠

django app中urls怎么获取主urls中的链接

项目中的每个 django 应用程序都应该有自己的 urls.py 吗?

Django 3.2.6:与 404 相关的应用程序 urls.py 中的路径顺序