Nginx proxy_pass uri 的 /
路径详细介绍。
Nginx配置proxy_pass转发的 / 路径问题
在nginx中配置proxy_pass时,如果是按照^~匹配路径时,要注意 proxy_pass
后的 url
最后的 /
:
- 当加上了
/
,相当于绝对根路径,则 nginx 不会把 location 中匹配的路径部分代理走 - 如果没有
/
,相当于相对路径,则会把匹配的路径部分也给代理走
示例
有 /
location ^~ /proxy_api/ {
proxy_cache api_cache;
proxy_set_header Host api.xiexianbin.cn;
proxy_pass http://api.xiexianbin.cn/;
}
如上面的配置,如果请求的 url
是 http://your_domain/proxy_api/load.php
,会被代理成 http://api.xiexianbin.cn/load.php
无 /
location ^~ /proxy_api/ {
proxy_cache api_cache;
proxy_set_header Host api.xiexianbin.cn;
proxy_pass http://api.xiexianbin.cn;
}
如上面的配置,则会被代理到http://api.xiexianbin.cn/proxy_api/load.php
其他实现方式
当然,我们可以用如下的 rewrite 来实现 / 的功能:
location ^~ /proxy_api/ {
proxy_cache api_cache;
proxy_set_header Host api.xiexianbin.cn;
rewrite /proxy_api/(.+)$ /$1 break;
proxy_pass http://api.xiexianbin.cn;
}
其他问题
Forwarded配置
location /abc/ {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_pass http://<ip>:<port>/;
}
Referer policy问题
location /abc/ {
# add_header 'Referrer-Policy' 'no-referrer-when-downgrade';
# add_header 'Referrer-Policy' 'unsafe-url';
# add_header 'Referrer-Policy' 'strict-origin';
# proxy_set_header Referer $http_referer;
proxy_set_header Referer http://<ip>:<port>$request_uri;
proxy_redirect off;
proxy_pass http://<ip>:<port>/;
}
CORS 跨域请求代理
location /abc/ {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Headers' 'X-Requested-With';
add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With' always;
proxy_pass http://<ip>:<port>/;
}
- nginx 反向代理支持 CORS(跨域请求访问)
CORS
机制跨域会首先发送一个 preflight
(方法为 OPTIONS)请求,该请求成功(http code
为 20x
)后才会发送真正的请求, Nginx 可以采用如下配置代理:
server {
...
location / {
# 针对浏览器的 OPTIONS 预请求直接返回 20x,否则会被403 forbidden--invalie CORS request
if ( $request_method = 'OPTIONS' ) {
return 200; # 204
}
proxy_pass http://<ip:port>/;
}
...
}