【问题标题】:Django always returns error 404 with nginxDjango 总是使用 nginx 返回错误 404
【发布时间】:2013-03-11 22:22:43
【问题描述】:

我对 Django 有疑问。应用程序的 url 配置如下所示:

urlpatterns = patterns(
    '',
    url(r'^api/', include(api_urls.getUrls())),
    url(r'^api/vk.com/buy.coins/$', VkPaymentsView.as_view()),
    url(r'^api/admin/', include(admin.site.urls)),
    url(r'^api-testing/((?P<method_code>[\w\./-]+?)/)?$', TestingView.as_view()),
)

我尝试请求正确的网址:

http://example.com/api-testing/

但我有一个 404 错误:

Page not found (404)
Request Method: GET
Request URL:    http://example.com/api-testing//

我看到一个额外的斜杠,这可能是问题的原因吗?

应用程序使用 nginx 以 FastCGI 模式启动:

python manage.py runfcgi method=threaded host=localhost port=9001 pidfile=$RUNFILES_PATH/$SITE.pid

这是 nginx 中的 fastcgi 参数:

fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param SCRIPT_FILENAME /var/www/$domain/$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $document_root;

fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param REQUEST_URI $uri;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_pass_header Authorization;
fastcgi_intercept_errors off;

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 SERVER_PROTOCOL $server_protocol;

proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;

fastcgi_param REDIRECT_STATUS 200;

【问题讨论】:

  • 你的两个斜杠肯定会出问题。
  • @arulmr,我也这么认为。但这是怎么出现的?即使在 nginx 调试日志 url 中也有一个斜杠。
  • 检查APPEND_SLASH 文件中的APPEND_SLASH 设置。
  • @arulmr,它不能解决问题,症状相同。但是有新的观察结果:如果我尝试不带斜杠的 url (http://example.com/api-testing),我也会遇到错误 404。但现在出现这样的错误文本:Request URL: http://example.com/api-testing/(一个斜杠)。

标签: django nginx fastcgi


【解决方案1】:

我找到了解决方案。问题出在 FastCGI 参数SCRIPT_NAME 中。我在 Django 位置指令中添加了fastcgi_param SCRIPT_NAME ''。然后问题就消失了。

location @django {
    fastcgi_pass localhost:9001;
    fastcgi_read_timeout 600;
    fastcgi_send_timeout 600;
    include fastcgi_params;
    fastcgi_param SCRIPT_NAME '';
}

【讨论】:

    猜你喜欢
    • 2014-05-29
    • 1970-01-01
    • 2018-07-15
    • 2017-01-18
    • 2016-03-11
    • 1970-01-01
    • 2012-04-02
    • 2012-08-16
    • 1970-01-01
    相关资源
    最近更新 更多