Debian

無論訪問什麼 url,Django 應用程序都會顯示相同的頁面

  • March 12, 2011

我有一個簡單的 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;
   }
}

任何幫助將不勝感激:)。

你有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 配置所有內容。

引用自:https://serverfault.com/questions/246484