我有一个正在生产中的 Django 应用程序,我的 Web 服务器是 Nginx。
我的应用程序位于/home/rouizi/blog
,假设我的域名是example.com
。我想防止用户读取位于blog
文件夹内的文件。
例如,按照我的实际配置,如果有人访问,exemple.com/manage.py
他就可以看到该文件的内容。我想向他显示一个404 not found
错误。
这是我的 nginx 配置:
/etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 1024;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
include /etc/nginx/conf.d/*.conf;
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options SAMEORIGIN;
add_header X-XSS-Protection "1; mode=block";
server_tokens off;
keepalive_timeout 75;
}
/etc/nginx/conf.d/example.conf
server {
if ($host = www.example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name example.com www.example.com;
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
# ssl stuff
server_name example.com www.example.com;
root /home/rouizi/blog/;
index index.html;
location /static {
alias /home/rouizi/blog/staticfiles/;
}
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://127.0.0.1:8000;
break;
}
}
gzip on;
gzip_comp_level 3;
gzip_types text/plain text/css application/javascript image/*;
}
我到目前为止尝试过的:
我添加了指令autoindex on;
并重新加载 nginx。没有用
我index.html
在里面添加了一个空文件blog directory
并重新加载了 nginx。没有用
我怎么解决这个问题 ?
编辑
我发现如果我在指令中输入我的 IP 地址而不是我的域名,server_name
目录浏览就会被禁用:
/etc/nginx/conf.d/example.conf
# ...
server {
# ...
# ssl stuff
server_name 139.151.187.143;
# ...
}
就像这样,如果我转到exemple.com/manage.py
或其他文件,404 not found
我的 Dango 应用程序就会出错。而且静态和媒体文件也不再可用。
有人能解释一下原因吗?这是否与我的 DNS 托管提供商有关?
答案1
static
对于 Django 驱动的应用程序,您通常不需要提供除了专门复制到文件夹的文件之外的任何内容。
这典型设置工作原理如下:
- 所有内容
/static
都由 Web 服务器处理(这就是该location /static {}
块的作用:指向 django命令放置静态文件alias
的目录)collectstatic
/media
根据需要对某个位置进行类似处理- 其他一切都会被转发到 wsgi 应用程序(这意味着你的程序文件不是直接访问nginx服务器)
您想要的可能是删除root /home/rouizi/blog/;
并无条件地(不在if (!-f $request_filename) {
块内)转发请求到您的 wsgi 应用程序。
答案2
您需要配置正在运行的应用程序127.0.0.1:8000
来阻止这些请求。
nginx 只是将以 开头的所有请求传递/
给您的 Web 应用程序,以 开头的请求除外/static
。