无论访问哪个 URL,Django 应用都会显示相同的页面

无论访问哪个 URL,Django 应用都会显示相同的页面

我有一个简单的 Django 应用程序,我正在使用它来测试使用 Nginx、FastCGI(在撰写本文时使用最新版本的 flup)和 daemontools 的新部署策略。

基本上,问题是,如果我访问 domain.com,主页会正确显示,但如果我访问 domain.com/example/,它仍然会显示主页。在我看来,这似乎是 FastCGI 的问题,但我完全被难住了。无论我访问哪个页面,它总是显示主页。没有错误,什么都没有。就像它总是默默地返回相同的页面,无论 URL 是什么。

nginx 错误日志中根本没有显示任何内容,因此没有任何帮助。该项目使用开发服务器 100% 完美运行,但在服务器上却失败了。

我的daemontools运行文件如下:

#!/usr/bin/env bash

source /envs/domain.com/bin/activate
PROJ_DIR=/project

exec envuidgid simon python $PROJ_DIR/manage.py \
        runfcgi method=threaded minspare=1 maxspare=2 host=127.0.0.1 \
        port=9001 pidfile=$PROJ_DIR/proj.pid daemonize=false

我的 nginx 配置:

server {
    listen 80;
    server_name domain.com;
    rewrite ^/(.*) http://www.domain.com/$1 permanent;
}

server {
    listen 80;
    server_name www.domain.com;

    access_log /domain.com/logs/access.log;
    error_log /domain.com/logs/error.log;

    root /domain.com/public_html;
    index index.html;

    location / {
        try_files $uri @django;
    }

    location /static {
        alias /project/static;
    }

    location /media {
        alias /project/media;
    }

    location @django {
        include /opt/nginx/conf/fastcgi_params;
        fastcgi_pass 127.0.0.1:9001;
        fastcgi_pass_header Authorization;
        fastcgi_intercept_errors off;
    }
}

如能提供任何帮助我将非常感激:)。

答案1

你有什么fastcgi_params?你应该有类似这样的内容:

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;

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;

还设置在settings.py

FORCE_SCRIPT_NAME = ''

这是其中一种方法。您也可以保留FORCE_SCRIPT_NAME默认设置,并通过 nginx 配置所有内容。

相关内容