Nginx 如何显示IP被阻止的页面?

Nginx 如何显示IP被阻止的页面?

我有一个这样的配置Nginx服务器:

server {
  listen 80;
  listen 443 ssl;

  ssl_certificate /etc/nginx/cert/domain.csr;
  ssl_certificate_key /etc/nginx/cert/domain.key;

  server_name ~^(\w+)\.(\w+)$ ;

  location / {
    rewrite ^\/(.*) /$1 break;
    proxy_pass https://my-app.ondigitalocean.app/ ;
  }

  error_page 500 502 503 504 /50x.html;
  location = /50x.html {
    root  /usr/share/nginx/html;
  }

  error_page 444 =200 @unavailable.html;
  location = @unavailable.html {
    #root   /usr/share/nginx/html;
    proxy_pass https://myapp.ondigitalocean.app/unavailable.html;
    allow all;
  }

  if ($allowed_country = no) {
    return 444;
  }
}

它工作正常,但我无法获取unavailable.html在远程服务器上分配的页面(参见proxy_pass),我的错误日志显示:

 [error] 20#20: *1 could not find named location "@unavailable.html", client: 172.17.0.1, server: ~^(\w+)\.(\w+)$

我错过了什么?这有可能吗?或者我必须将这样的页面复制粘贴到Nginx家?

答案1

您不能=在以下位置使用等号前缀命名地点(用 at 符号表示@)。这些总是精确的无论如何都会匹配 - 并且不像常规 URI 那样带有前缀,如两个不同的语法描述location

location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }

然后,您可以强制将传递给上游的路径设置为您想要的路径:

location @unavailable.html {
  rewrite ^ /unavailable.html break;
  proxy_pass https://myapp.ondigitalocean.app;
}

Nginx文档实际上建议不要将 URI 放入proxy_pass此处的指令中;重点是我的:

在某些情况下,无法确定要替换的请求 URI 部分:当使用正则表达式指定位置时,并且在指定位置内在这些情况下,proxy_pass 应该是未指定 URI

附注:你应该不是return 444除非你想要特殊行为,否则使用Nginx分配给该值。你还应该不是200除非您成功返回请求的资源,否则返回状态代码。

如果你已经制作了资源不可用根据你怀疑访问者来自哪个国家/地区,返回一个特定于你这样做的原因的代码(通常403 Forbidden或者451 Unavailable For Legal Reasons)

相关内容