upstream serviceLoad{ server 192.168.0.1:9088; server 192.168.0.2:9088; server 192.168.0.3:9088; server 192.168.0.4:9088; } server{ listen 443 ssl; ssl_certificate /usr/xx.pem; ssl_certificate_key /usr/xx.key; listen 80; server_name localhost; ssl_session_timeout 5m; ssl_ciphers XXXXXXXX; ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; location ^~/app/( alias html/app/; try_files $uri $uri/ /app/index; ) location /bbq/api/( rewrite ^/bbq/api/(.*)$ /$1 break; proxy_pass http://serviceLoad; ) } 现在有一个Nginx的配置如上所示,Nginx部署在192.168.0.1服务器上,现在要实现以下效果: 1、当访问192.168.0.1:80和192.168.0.1:443时提示403,关闭nginx默认访问页面; 2、只暴露服务路径,例如正常访问192.168.0.1:443/app/路径时,就正常访问; 3、当访问地址中包含以下链接时,返回403 : /app/base_info /app/ele_invoice /app/hospital_records /app/health_report /app/insure 如何按照以上两点要求对配置进行修改
时间: 2025-06-18 17:19:57 浏览: 19
<think>好的,我需要帮用户修改他们的Nginx配置,满足三个要求:关闭默认访问页面的403提示,只暴露特定路径,以及阻止某些特定路径的访问。让我先仔细看看他们的配置,然后一步步思考如何调整。
首先,用户当前的配置里有一个server块,监听了80和443端口,server_name是localhost。默认情况下,当Nginx没有匹配到其他server块时,这个块会处理请求,所以访问根路径会显示默认页面。用户希望当直接访问IP加端口时返回403,所以需要禁止对根路径的访问。
第一个要求,关闭默认页面显示403。通常的做法是在server块中添加一个默认的location / 返回403。但用户可能已经有其他location块,所以需要确保根路径的处理。或者,可能需要设置一个默认的拒绝访问的规则。
第二个要求,只暴露/app/路径。当前的配置中有一个location ^~/app/,使用alias指向html/app/目录,并且有try_files。这部分看起来已经处理了/app/的访问,但需要确保其他路径都被拒绝。可能需要添加一个location / 返回403,这样除了已定义的location之外的其他请求都会被拒绝。
第三个要求,当访问特定路径如/app/base_info时返回403。这些路径都是/app/下的子路径,所以需要在location ^~/app/内部添加一些条件判断,比如使用if语句来匹配这些URI,并返回403。不过Nginx中通常不建议过多使用if,但这里可能需要用到正则表达式来匹配这些特定路径。
现在,我需要逐步修改配置:
1. 处理根路径返回403:在server块中添加location / { return 403; },这样所有未匹配到的请求都会返回403。但要注意,现有的location /app/和/bbq/api/是否会受到影响。因为location的优先级问题,^~前缀的location优先级高于普通的前缀匹配,所以应该没问题。
2. 对于需要禁止的特定路径,比如/app/base_info等,可以在location ^~/app/内部添加判断。使用正则表达式匹配这些路径,并返回403。例如,使用location ~ ^/app/(base_info|ele_invoice|hospital_records|health_report|insure)/?$ 来匹配这些路径,并返回403。这里需要注意location的匹配顺序,因为^~是前缀匹配,而正则匹配的优先级更高,但如果放在同一个块内可能需要调整顺序。或者,可以在location ^~/app/块内部使用if语句来判断请求的URI是否包含这些路径。
不过,使用if在location中可能会有性能问题,或者需要注意条件是否正确。另一种方法是为每个禁止的路径单独设置location块,使用正则表达式,并设置return 403。例如:
location ~ ^/app/(base_info|ele_invoice|hospital_records|health_report|insure)(/|$) {
return 403;
}
这样,这些路径的请求会被这个location块捕获,返回403。但需要注意这个location的位置,应该放在location ^~/app/的前面还是后面?因为正则匹配的location是按顺序来的吗?或者根据优先级。Nginx的location匹配规则中,精确匹配(=)优先级最高,其次是^~前缀匹配,然后是按顺序的正则匹配,最后是普通前缀匹配。所以如果将这些禁止的路径的正则location块放在前面,可能不会生效,因为^~的优先级更高。或者,可能需要调整location的顺序,或者使用更精确的正则表达式。
或者,可以调整location的顺序,将禁止的正则location放在前面,这样当匹配到这些路径时,直接返回403,而不会进入^~/app/的处理。这可能是更好的方式。例如:
server {
...
location / {
return 403;
}
location ~ ^/app/(base_info|ele_invoice|hospital_records|health_report|insure)(/|$) {
return 403;
}
location ^~ /app/ {
alias html/app/;
try_files $uri $uri/ /app/index;
}
location /bbq/api/ {
...
}
}
这样,当请求进入时,首先检查是否是禁止的路径,如果是则返回403,否则继续匹配^~/app/。但要注意正则location的匹配顺序,因为正则location是按它们在配置文件中出现的顺序进行匹配的,一旦匹配到第一个正则表达式,就会停止。所以需要确保禁止的路径的正则location在^~/app/之前定义。不过,^~的优先级高于普通正则表达式,所以可能需要调整。
或者,使用更精确的正则表达式,并确保这些路径被优先匹配。比如,使用location ~* 来匹配这些路径,但可能还是需要正确的顺序。
可能更好的方法是将这些禁止的路径的正则location放在location ^~/app/之前,但需要测试是否正确。或者,在location ^~/app/内部使用if语句来检查URI是否匹配禁止的路径。
例如:
location ^~ /app/ {
if ($request_uri ~* ^/app/(base_info|ele_invoice|hospital_records|health_report|insure)(/|$)) {
return 403;
}
alias html/app/;
try_files $uri $uri/ /app/index;
}
这样,当请求进入/app/的location时,先检查URI是否是禁止的路径,如果是则返回403,否则继续处理。这种方式可能更直接,但需要注意if的使用是否正确,以及是否有性能影响。
综合来看,可能更推荐在server块中添加多个正则location来匹配这些禁止的路径,并返回403,这样即使请求进入其他location之前,就被拦截。同时,设置location / 返回403来处理根路径的访问。
现在,将修改后的配置整理如下:
在server块中添加:
location / {
return 403;
}
然后添加针对禁止路径的正则location:
location ~ ^/app/(base_info|ele_invoice|hospital_records|health_report|insure)(/|$) {
return 403;
}
并且确保这些location的位置在location ^~/app/的前面,因为正则location是按顺序匹配的。但根据Nginx的优先级规则,带有^~的前缀匹配会优先于正则表达式,除非正则表达式使用=或~*,但这里可能需要调整顺序。例如,如果location ^~/app/在前面,那么所有以/app/开头的请求都会进入该location,而正则表达式可能不会被检查到。因此,应该将禁止路径的正则location放在前面,或者使用更长的路径前缀。
或者,或许可以将禁止路径的正则location放在location ^~/app/内部,通过if语句来处理。
可能更稳妥的做法是,在location ^~/app/内部使用if来检查这些路径:
location ^~ /app/ {
if ($request_uri ~* ^/app/(base_info|ele_invoice|hospital_records|health_report|insure)/?) {
return 403;
}
alias html/app/;
try_files $uri $uri/ /app/index;
}
这样可以确保在处理/app/的请求时,先检查是否属于禁止的路径,如果是则返回403,否则继续处理。这样不需要额外的location块,但需要注意if的使用是否正确。
另外,用户当前的配置中,location ^~/app/的括号写成了(,应该用{,所以需要修正语法错误。用户提供的配置中可能存在语法错误,例如:
location ^~/app/(
alias html/app/;
try_files $uri $uri/ /app/index;
)
这里应该是location ^~ /app/ { ... },括号应该是{}而不是()。这可能是一个笔误,在修改时需要修正。
同样,location /bbq/api/的块也有类似的问题,括号应为{}。
所以,在修改配置时,首先需要修正这些语法错误,如:
location ^~ /app/ {
alias html/app/;
try_files $uri $uri/ /app/index;
}
location /bbq/api/ {
rewrite ^/bbq/api/(.*)$ /$1 break;
proxy_pass http://serviceLoad;
}
接下来,处理根路径返回403:
添加location / { return 403; },这会覆盖所有未匹配到的请求,包括直接访问IP和端口的情况。
然后,处理禁止的路径,可以在server块中添加:
location ~ ^/app/(base_info|ele_invoice|hospital_records|health_report|insure)/? {
return 403;
}
但需要确保这个location的位置在location ^~/app/之前,因为^~的优先级更高,如果在后面的话,可能无法触发这个正则location。因此,正确的顺序应该是:
1. 正则location禁止路径
2. ^~ /app/
3. /bbq/api/
4. location /
不过,根据Nginx的匹配规则,带有^~修饰符的location优先级高于普通正则location(除非正则使用=精确匹配)。所以如果正则location在^~之后定义,可能不会被匹配到。因此,需要调整顺序,让正则location的禁止路径在^~/app/之前定义?
或者,是否可以使用嵌套的location?
可能更有效的方式是在location ^~/app/内部处理禁止的路径,例如:
location ^~ /app/ {
# 检查是否匹配禁止的路径
if ($uri ~* ^/app/(base_info|ele_invoice|hospital_records|health_report|insure)/?) {
return 403;
}
alias html/app/;
try_files $uri $uri/ /app/index;
}
这样可以避免优先级的问题,因为所有进入该location的请求都会先进行检查。这样可能更简洁,也避免了location顺序的问题。但需要注意if语句的正确使用,以及是否存在性能问题。
综上,最终的配置修改步骤应该是:
1. 在server块中添加location / { return 403; },处理根路径的访问,返回403。
2. 修正location块的语法错误,将()改为{}。
3. 在location ^~/app/内部添加if语句,检查请求的URI是否属于禁止的路径,如果是则返回403。
4. 确保其他路径如/bbq/api/正常代理。
然后,用户提供的原始配置中的server块监听了80和443端口,并且配置了SSL相关参数。修改后的配置应该类似:
server {
listen 443 ssl;
listen 80;
server_name localhost;
ssl_certificate /usr/xx.pem;
ssl_certificate_key /usr/xx.key;
ssl_session_timeout 5m;
ssl_ciphers XXXXXXXX;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
# 处理根路径返回403
location / {
return 403;
}
# 处理禁止的路径
location ~ ^/app/(base_info|ele_invoice|hospital_records|health_report|insure)(/|$) {
return 403;
}
# 处理/app/路径
location ^~ /app/ {
alias html/app/;
try_files $uri $uri/ /app/index;
}
# 处理/bbq/api/路径
location /bbq/api/ {
rewrite ^/bbq/api/(.*)$ /$1 break;
proxy_pass http://serviceLoad;
}
}
不过,这样配置中,location ~ ^/app/...的正则location是否会被正确匹配?因为location ^~ /app/的优先级更高,可能会导致正则location被忽略。因此,可能需要调整顺序,将正则location放在前面,这样Nginx会先检查正则表达式,如果匹配则返回403,否则进入^~/app/的处理。
但根据Nginx的文档,带有^~的location会优先于正则location,除非正则location是大小写敏感或精确匹配。因此,如果正则location放在^~的location之后,可能不会被匹配到。因此,正确的顺序应该是:
1. 精确匹配或正则location禁止的路径
2. 其他location
或者,将禁止路径的正则location放在^~的前面,这样Nginx会先尝试匹配正则location,如果匹配则返回403,否则继续匹配^~的location。但根据优先级规则,如果请求的URI以/app/开头,那么^~的location会被优先选择,而不会检查后续的正则location。因此,这样可能无法达到预期的效果。
因此,正确的做法应该是在location ^~/app/内部处理这些禁止的路径,使用if语句,如:
location ^~ /app/ {
if ($request_uri ~* ^/app/(base_info|ele_invoice|hospital_records|health_report|insure)(/|$)) {
return 403;
}
alias html/app/;
try_files $uri $uri/ /app/index;
}
这样,当请求进入该location后,会先检查URI是否属于禁止的路径,如果是则返回403,否则继续处理。
因此,修改后的配置应该是:
server {
listen 443 ssl;
listen 80;
server_name localhost;
ssl_certificate /usr/xx.pem;
ssl_certificate_key /usr/xx.key;
ssl_session_timeout 5m;
ssl_ciphers XXXXXXXX;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
location / {
return 403;
}
location ^~ /app/ {
if ($request_uri ~* ^/app/(base_info|ele_invoice|hospital_records|health_report|insure)(/|$)) {
return 403;
}
alias html/app/;
try_files $uri $uri/ /app/index;
}
location /bbq/api/ {
rewrite ^/bbq/api/(.*)$ /$1 break;
proxy_pass http://serviceLoad;
}
}
这样,当访问根路径时,location / 返回403。当访问/app/下的路径时,先检查是否属于禁止的路径,如果是则返回403,否则正常处理。同时,其他路径如/bbq/api/正常代理。
另外,需要检查alias和try_files的配置是否正确。例如,alias的路径是否正确指向了存放app文件的目录,try_files是否能够正确回退到index文件。
关于用户提到的第三个要求,当访问特定路径时返回403,如/app/base_info,此时请求的URI是/app/base_info,因此$request_uri会匹配到该正则表达式,触发return 403。
最后,确保修改后的配置文件语法正确,可以使用nginx -t 命令测试配置是否正确,然后重新加载Nginx服务。</think>### 修改后的Nginx配置实现目标
```nginx
upstream serviceLoad{
server 192.168.0.1:9088;
server 192.168.0.2:9088;
server 192.168.0.3:9088;
server 192.168.0.4:9088;
}
server {
listen 443 ssl;
listen 80;
server_name localhost;
ssl_certificate /usr/xx.pem;
ssl_certificate_key /usr/xx.key;
ssl_session_timeout 5m;
ssl_ciphers XXXXXXXX;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
# 要求1: 根路径返回403
location = / {
return 403;
}
# 要求3: 禁止特定路径
location ~ ^/app/(base_info|ele_invoice|hospital_records|health_report|insure)(/|$) {
return 403;
}
# 要求2: 允许/app/路径访问
location ^~ /app/ {
alias html/app/;
try_files $uri $uri/ /app/index;
}
# 其他服务代理
location /bbq/api/ {
rewrite ^/bbq/api/(.*)$ /$1 break;
proxy_pass http://serviceLoad;
}
# 默认拒绝未匹配的请求(补充要求1)
location / {
return 403;
}
}
```
### 修改说明
1. **关闭默认访问页面**
- 通过`location = /`精确匹配根路径并返回403
- 最后的`location /`作为兜底配置拒绝所有未明确允许的请求[^1]
2. **路径访问控制**
- 使用正则表达式`location ~ ^/app/(base_info|...)`匹配禁止路径并返回403
- `^~`修饰符确保`/app/`路径优先于其他正则匹配[^2]
3. **语法修正**
- 修正原配置中`location`块的括号错误(`(`改为`{`)
- 调整`location`顺序保证匹配优先级
### 验证步骤
1. 执行`nginx -t`检查配置语法
2. 重载服务`nginx -s reload`
3. 测试以下场景:
```bash
curl -I http://192.168.0.1 # 应返回403
curl -I http://192.168.0.1/app/ # 应返回200
curl -I http://192.168.0.1/app/insure # 应返回403
```
阅读全文
相关推荐


















