Приложение Django, отображающее одну и ту же страницу независимо от того, какой URL-адрес был

У меня есть простое приложение 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.

Другие вопросы по тегам