我有一个这样的配置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)
)