我正在使用 Nginx 将代理传递到由 Circus 提供的 wsgi 应用程序。
我只想允许某些 IP 地址的某些 URL 访问该应用程序。
现在它看起来像这样:
server {
listen 80;
server_name service.dev;
access_log /var/log/service.access.log;
error_log /var/log/service.error.log debug;
location / {
try_files $uri @proxy_to_app;
}
location @proxy_to_app {
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://127.0.0.1:9000/;
}
location /admin/ {
allow 192.168.5.0/24;
deny all;
}
}
但它不起作用。如果我有权限,我会收到 404 错误,而不是 proxy_pass。
您知道怎样才能做到这一点而不必每次都复制/粘贴 proxy_pass 配置吗?
谢谢。
答案1
编辑2
根据 VBart 的评论,我将 中的条目更改try_files
为$uri @proxy_to_app
。这避免了命名位置顺序的任何混淆(它们必须始终排在最后)。请注意,如果目录/admin/
在本地存在,则将使用它而不是代理。
编辑
如果你真的想要使用命名位置以避免proxy_pass
每个位置重复,您可以使用以下命令:
server {
listen 80;
server_name service.dev;
access_log /var/log/service.access.log;
error_log /var/log/service.error.log debug;
location / {
# Catch all
try_files $uri @proxy_to_app;
}
location /admin/ {
# /admin/ only
allow 192.168.5.0/24;
deny all;
try_files $uri @proxy_to_app;
}
location @proxy_to_app {
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://127.0.0.1:9000;
}
}
这有点像黑客行为,try_files
至少需要两个参数,首先它会寻找具有相同的本地路径$uri
(如果您想用本地文件覆盖)。在第二个实例中,我将其指定/dev/null
为第二条路径;这将永远不会被使用。
原来的
尝试以下配置:
server {
listen 80;
server_name service.dev;
access_log /var/log/service.access.log;
error_log /var/log/service.error.log debug;
# Proxy settings
proxy_set_header Host $http_host;
proxy_redirect off;
location / {
# Catch all
proxy_pass http://127.0.0.1:9000/;
}
location /admin/ {
# /admin/ only
allow 192.168.5.0/24;
deny all;
proxy_pass http://127.0.0.1:9000/;
}
}
该location /
块应该只捕获随后在其他位置块中未匹配的 URI。