【发布时间】:2023-04-04 02:20:01
【问题描述】:
我正在使用我的 Django 项目设置 Nginx 配置。
为了提供一些在 URL 上不显示 /static/ 的静态文件,
我在 Nginx 配置中添加了一些重写规则。
这是我的 Nginx 配置的一部分:
location /static/ {
location ~* \.(png|jpg|jpeg|gif|css|js)$ {
access_log off;
expires 30d;
}
alias /path/to/myproject/static/;
}
location ~ ^/favicon.ico$ {
rewrite ^/favicon.ico$ /static/favicon.ico;
}
location /foo/ {
rewrite ^/foo/(.*)$ /static/abc/$1;
}
location /bar/ {
rewrite ^/bar/(.*)$ /static/bar/$1;
}
location / {
fastcgi_pass myproject;
include django_fastcgi_params;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
当我访问https://myproject.com/foo 时,它会显示 Django 的 404 页面。我认为这是因为 Nginx 中没有匹配的位置(应该以斜线结尾/)并且 Django 的urls.py 中没有匹配的 URL。
当我访问https://myproject.com/foo/时,会在myproject/static/foo/文件夹下显示index.html,或者如果没有index.html,则会出现403 Forbidden。
但我发现...
当我访问https://myproject.com/foo/abc时,它将301永久移动到https://myproject.com/static/foo/abc/
当我访问https://myproject.com/foo/abc/时,会直接显示https://myproject.com/foo/abc/,即myproject/static/abc/下的index.html文件
为什么这两个 URL 的工作方式不同?
有什么需要修改的吗?
【问题讨论】:
-
请出示您的
settings.py文件? -
您是否在问为什么您的
location /块不会自动附加/而您的其他location块会? -
这个配置太模糊了,丢失了重要的细节,或者这里的东西不正确。此配置中没有启用索引(列出文件)的行,并且 403 是正确的(示例 2),这意味着 直接显示某个文件夹下的文件(示例 4)实际上是不可能的。
-
我在 settings.py 中设置了 APPEND_SLASH=True。但我想我正在尝试在没有 Django 的情况下提供这些静态文件。这就是我在 Nginx 配置中添加这些规则的原因。
-
@RichardSmith 我认为myproject.com/foo/abc 和myproject.com/foo/abc 都应该匹配规则位置/foo/。所以我的问题是为什么这两个 URL 的工作方式不同。
标签: django nginx django-staticfiles nginx-config