Php 如何让多个位置块使用相同的命名@location
我正在尝试创建一个nginx-conf文件,其中几乎没有重复。我使用nginx提供静态文件,它将404s或php内容代理到指定位置@varnish:Php 如何让多个位置块使用相同的命名@location,php,nginx,Php,Nginx,我正在尝试创建一个nginx-conf文件,其中几乎没有重复。我使用nginx提供静态文件,它将404s或php内容代理到指定位置@varnish: location @varnish { proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_for
location @varnish {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass_header Set-Cookie;
proxy_pass http://localhost:6081;
proxy_set_header Request-URI $request_uri;
}
location ~ \.php$ {
rewrite . @varnish last;
}
对于“标准”情况,即nginx应该检查是否有文件,然后传递到后端,以下操作可以正常工作:
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
access_log off;
add_header Pragma public;
add_header Cache-Control "public, must-revalidate, proxy-revalidate";
expires max;
open_file_cache_valid 120m;
try_files $uri @varnish;
}
但是,对于PHP,我甚至不希望它尝试该文件,它应该立即将请求重定向到@varnish:
location @varnish {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass_header Set-Cookie;
proxy_pass http://localhost:6081;
proxy_set_header Request-URI $request_uri;
}
location ~ \.php$ {
rewrite . @varnish last;
}
然而,这似乎不起作用。两个几乎完全相同的块(一个用于@backend,一个用于php)都引用同一个代理,这似乎是一个痛苦的问题,人们可能会忘记将某些内容放在其中,而不是放在另一个中。如果您将代理设置放在服务器上下文中,并让位置继承它们,那么就没有什么可复制的了。您还可以设置上游块,以便在需要时更容易地更改代理目标:
upstream _varnish {
server localhost:6081;
}
server {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Request-URI $request_uri;
proxy_pass_header Set-Cookie;
location @varnish {
proxy_pass http://_varnish;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
access_log off;
add_header Pragma public;
add_header Cache-Control "public, must-revalidate, proxy-revalidate";
expires max;
open_file_cache_valid 120m;
try_files $uri @varnish;
}
location ~ \.php$ {
proxy_pass http://_varnish;
}
}