nginx.conf中配置上不允许访问的网站目录

本文介绍了一个Nginx配置中的安全漏洞,即未禁止访问敏感目录如WEB-INF,可能导致系统架构、源代码等信息泄露。提供了正确的配置示例,确保商业项目的安全性。

 

 

nginx.conf 配置中有个漏洞,那就是没有配置哪些目录是不允许直接访问的,在传统tomcat作为服务器的时候,tomcat本身的机制就禁止直接访问WEB-INF下的内容,但是在nginx中,由于配置了部分内容直接从nginx转发出去,这就导致了WEB-INF目录实际上可能会被暴露出去,一旦暴漏了,那么系统架构,源代码,数据库配置文件,系统配置文件等内容将一并泄露,这对于商业项目来讲会是致命的安全隐患,再次提醒自己以及相关人士,一定要配置不允许访问的目录。

 

为此,必须在nginx.conf中配置上不允许访问的网站目录。

 

不允许访问配置方式如下:

 

       location ~ ^/(WEB-INF|META-INF)/{
                deny all;
        }

 

 

一个完整的nginx.conf例子:

 

user root;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  10240;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    gzip  on;
    gzip_min_length 1k;
    gzip_buffers 16 64k;
    gzip_http_version 1.1;
    gzip_comp_level 2;
    gzip_types application/json text/plain text/css;
    gzip_vary on;

    fastcgi_intercept_errors on;

	upstream tomcat_server {
	   server   127.0.0.1:8080;
#      server   127.0.0.1:8081;
#      server   127.0.0.1:8082;
	}


############################
########   server start ####
############################
    server {
        listen       80;
        server_name  www.xxx.com;
        root    /data/www/www.xxx.com;

        location /{
        	index index.htm index.html index.jsp;
        }

        location ~ ^/(WEB-INF|META-INF)/{
                deny all;
        }

        location ~ \.(jsp|do)?$ {
	        proxy_set_header Host  $host:80;
	        proxy_set_header X-Forwarded-For  $remote_addr;
	        proxy_pass http://tomcat_server;
    	}

    	location ~ .*\.(js|css|gif|jpg|jpeg|png|bmp|swf)$ {
	        expires 24h;
	    }

        if (!-e $request_filename){
                rewrite "^/a/eg/([0-9]+)/([0-9]+)/([0-9]+)$" /api/eventlog.do?game_id=$1&platform_id=$2&channel_id=$3 last;
                rewrite "^/games/game_([0-9]+)\.html$" /games/game_show.jsp?id=$1 last;
        	rewrite "^/games/page_([0-9]+)\.html$" /games/index.jsp?p=$1 last;
        	rewrite "^/games/category_([0-9]+)\.html$" /games/index.jsp?c=$1 last;
        	rewrite "^/games/category_([0-9]+)/page_([0-9]+)\.html$" /games/index.jsp?c=$1&p=$2 last;
        	rewrite "^/blogs/blog_([0-9]+)\.html$" /blogs/blog_show.jsp?id=$1 last;
        	rewrite "^/blogs/page_([0-9]+)\.html$" /blogs/index.jsp?p=$1 last;
        	rewrite "^/blogs/category_([0-9]+)\.html$" /blogs/index.jsp?c=$1 last;
        	rewrite "^/blogs/category_([0-9]+)/page_([0-9]+)\.html$" /blogs/index.jsp?c=$1&p=$2 last;
        	rewrite "^/links/category_([0-9]+)\.html$" /links/index.jsp?c=$1 last;
        }
    }
############################
########   server end   ####
############################
}

 

 

 

<think>我们之前的问题是关于Docker Compose和Nginx配置访问前端仍然是Nginx默认首页的问题。现在用户的新问题是关于如何配置nginx.conf中的路由。根据用户提供的引用和之前的上下文,我们来详细解释Nginx路由配置方法。 用户提供的引用材料中提到了Nginx配置文件的结构,包括主配置文件(nginx.conf)、包含的文件(如conf.d目录下的配置文件)、server块和location块。其中,location块用于配置路由。 在Nginx中,路由配置主要通过在server块中定义同的location块来实现。每个location块可以匹配特定的URI,并定义如何处理这些请求。 ### Nginx路由配置详解 #### 1. 基本语法 ```nginx location [修饰符] 匹配模式 { # 配置指令 } ``` #### 2. 匹配修饰符 - `=`:精确匹配。例如:`location = /path` 只会匹配 `/path`。 - `^~`:前缀匹配,如果匹配成功,则再进行正则匹配。 - `~`:区分大小写的正则匹配。 - `~*`:区分大小写的正则匹配。 - 无修饰符:普通前缀匹配(匹配以指定模式开头的URI)。 #### 3. 匹配优先级 Nginx按以下顺序匹配location: 1. 精确匹配(`=`)。 2. 前缀匹配(`^~`)。 3. 正则匹配(`~`和`~*`),按配置文件中的顺序匹配,第一个匹配成功的将被使用。 4. 普通前缀匹配(带修饰符),最长前缀匹配。 #### 4. 常见配置示例 ##### 示例1:静态文件服务 ```nginx server { listen 80; server_name localhost; # 根目录配置 root /usr/share/nginx/html; # 首页 index index.html; # 处理根路径请求 location / { try_files $uri $uri/ /index.html; } # 匹配图片请求 location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { # 设置缓存时间 expires 30d; } } ``` ##### 示例2:反向代理到后端服务 ```nginx server { listen 80; server_name api.example.com; # 代理所有请求到后端应用 location / { proxy_pass http://backend_server; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # 单独处理/api路径 location /api { # 可以添加额外的代理设置 proxy_pass http://backend_server/api; } } # 定义后端服务器组 upstream backend_server { server 192.168.1.100:8080; server 192.168.1.101:8080; } ``` ##### 示例3:重定向和重写 ```nginx server { listen 80; server_name www.old-domain.com; # 永久重定向到新域名 location / { return 301 https://www.new-domain.com$request_uri; } } server { listen 80; server_name www.new-domain.com; # 重写URL(去掉.php扩展名) location / { try_files $uri $uri.html $uri/ =404; } location ~ \.php$ { # 处理PHP请求 fastcgi_pass php:9000; # ...其他fastcgi配置 } } ``` #### 5. 路由配置中的常用指令 - `try_files`:按顺序检查文件是否存在,并返回第一个找到的文件。如果都找到,则执行最后一个参数(可以是命名location或状态码)。 - `rewrite`:重写URI。 - `alias`:定义目录别名,用于将请求映射到文件系统的同路径。 - `proxy_pass`:将请求代理到指定的服务器。 - `root`:设置请求的根目录。 - `index`:定义索引文件。 ### 解决用户之前的问题(仍显示Nginx默认首页) 结合用户之前的问题,我们注意到前端服务的配置中,Nginx容器的挂载路径是: ```yaml volumes: - ./frontend/dist/:/usr/share/nginx/html ``` 而在Nginx配置中,location / 的root是`/usr/share/nginx/html`,这应该是正确的。所以问题可能在于: 1. 宿主机路径`./frontend/dist/`下是否有前端构建的文件(如index.html)? 2. 挂载是否成功?可以通过进入容器检查文件是否存在来验证。 另外,在docker-compose中,前端服务映射的端口是80:3300,这个3300端口在Nginx容器内部应该是80(因为Nginx镜像默认监听80端口)。所以用户应该通过宿主机的80端口访问,而是3300。 ### 结论 在Nginx配置路由主要是通过server块中的location指令来实现。根据匹配模式(精确匹配、前缀匹配、正则匹配)来路由请求,并可以结合反向代理、静态文件服务、重定向等功能。 针对用户之前的问题,除了路由配置外,还需要检查挂载的文件是否存在以及端口映射是否正确。 ### 相关问题 1. Nginx location匹配优先级的具体规则是什么? 2. 如何配置Nginx的反向代理以支持WebSocket? 3. Nginx的try_files指令有哪些常见用法? 4. 如何解决Nginx配置中出现的404错误? 5. 如何优化Nginx处理静态资源的性能? 希望这些信息能帮助用户理解Nginx的路由配置方法和解决之前的问题。 </think>### Nginx 路由配置详解 在 Nginx 中,路由配置主要通过 `server` 块和 `location` 块实现,用于定义请求的分发规则。以下是核心配置方法: #### 一、基础路由配置结构 ```nginx http { # 全局配置(如负载均衡) upstream backend { server 192.168.1.10:8080; # 后端服务器1 server 192.168.1.11:8080; # 后端服务器2 } server { listen 80; # 监听端口 server_name example.com; # 域名 # 路由规则1:精确匹配根路径 location = / { root /var/www/home; # 静态资源目录 index index.html; # 默认文件 } # 路由规则2:API请求反向代理 location /api { proxy_pass http://backend; # 转发到upstream proxy_set_header Host $host; } # 路由规则3:正则匹配图片路由 location ~* \.(jpg|png)$ { root /var/www/images; expires 30d; # 缓存30天 } } } ``` #### 二、路由匹配优先级规则 1. **匹配类型优先级**(由高到低): - `location = /path` → 精确匹配 - `location ^~ /path` → 优先前缀匹配 - `location ~ /pattern` → 正则匹配(区分大小写) - `location ~* /pattern` → 正则匹配(区分大小写) - `location /prefix` → 普通前缀匹配 - `location /` → 通用匹配 2. **匹配顺序示例**: ```nginx location = /login { ... } # 1. 优先匹配 /login location ^~ /static { ... } # 2. 其次匹配 /static 开头的路径 location ~ \.php$ { ... } # 3. 再匹配 .php 结尾的请求 location / { ... } # 4. 最后匹配其他所有请求 ``` #### 三、实战路由配置场景 1. **静态资源路由** ```nginx location /assets { alias /var/www/static; # 使用alias移除URI前缀 try_files $uri $uri/ =404; gzip on; # 启用压缩[^4] } ``` 2. **动态请求代理** ```nginx location ~ ^/user/(\d+) { proxy_pass http://user_service/$1; # 提取正则参数 proxy_set_header X-Real-IP $remote_addr; } ``` 3. **重定向路由** ```nginx location /old-path { return 301 https://$host/new-path; # 永久重定向 } ``` #### 四、高级路由技巧 1. **负载均衡路由** ```nginx upstream app_cluster { least_conn; # 最少连接算法 server 10.0.0.1:8000 weight=3; server 10.0.0.2:8000; } location /service { proxy_pass http://app_cluster; } ``` 2. **路由访问控制** ```nginx location /admin { allow 192.168.1.0/24; # 允许IP段 deny all; # 拒绝其他IP auth_basic "Admin Area"; # HTTP认证 } ``` 3. **跨域路由处理** ```nginx location /api { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST'; if ($request_method = 'OPTIONS') { return 204; } # 预检请求 } ``` > **重要提示**:修改配置后需验证语法 `nginx -t` 并重载服务 `nginx -s reload`[^1] ### 配置验证与调试 1. 日志检查: ```bash tail -f /var/log/nginx/access.log tail -f /var/log/nginx/error.log ``` 2. 请求跟踪: ```nginx location /debug { add_header X-Route-Debug "Matched /debug"; # 自定义响应头 } ``` ### 相关问题 1. Nginx的正则表达式路由有哪些特殊匹配规则? 2. 如何实现基于地理位置的动态路由配置? 3. Nginx与Kubernetes Ingress的路由配置有何区别? 4. 路由配置错误导致502 Bad Gateway如何排查? 5. 如何优化高并发场景下的路由匹配性能? > 引用说明: > [^1]: Nginx配置加载顺序 > [^2]: server模块配置方法 > [^3]: 常见配置项解释 > [^4]: gzip压缩与负载均衡配置
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值