Nginx 反向代理 405 PUT Chrome
Nginx Reverse Proxy 405 PUT Chrome
当我尝试通过 Nginx 反向代理向我的 Tomcat 服务器请求时,我收到了 405 响应。
如果我直接请求 tomcat 服务器,它可以从 Chrome 或 Firefox 成功运行。但是,如果我请求 Nginx 代理,我会从 Chrome 获得 405,但在 Firefox 中有效。
我一直在 nginx.conf 下使用不同的配置进行测试
location/foo/ { ... }
我试过:
error_page 405 =200 $uri;
还有
add_header "Allow" "GET, POST, HEAD, PUT, DELETE" always;
add_header "Access-Control-Allow-Methods" "GET, POST, PUT, DELETE, OPTIONS" always;`
location / {
dav_methods PUT DELETE;
proxy_pass http://csprocure;
}
我的 nginx.conf 重定向如下:
upstream serverS {
server xxx.xxx.xxx.xxx:yyyy;
}
server {
listen 80;
server_name $hostname;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
error_log /dev/stdout info;
access_log /dev/stdout;
location /foo/ {
proxy_pass http://serverS;
proxy_redirect http://xxx.xxx.xxx.xxx/ http://xxx.xxx.xxx.xxx:yyyy/;
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 X-Forwarded-Host $server_name;
proxy_set_header X-Forwarded-Proto: https;
}
我可以在我的配置中添加什么来避免 Chrome 中的 405?
可以找到关于将 HTTP 方法列入白名单的很好的在线解释 here
这对我有用:
add_header Allow "GET, POST, HEAD, PUT, DELETE" always;
if ( $request_method !~ ^(GET|POST|HEAD|PUT|DELETE)$ ) {
return 405;
}
..显然,确保在测试更改前检查配置 nginx -t
并重新加载配置 nginx -s reload
我一直在比较 Firefox 和 Chrome 之间的请求,在 Chrome 方面存在差异,在请求 Chrome 中添加一个 "Origin" 参数header 请求出错。
所以在我的 nginx.conf 中,我添加了参数以避免它位于 location/
proxy_set_header Origin "";
所以我现在的位置配置块是:
location /foo/ {
proxy_set_header Origin "";
proxy_pass http://serverS;
proxy_redirect http://xxx.xxx.xxx.xxx/ http://xxx.xxx.xxx.xxx:yyyy/;
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 X-Forwarded-Host $server_name;
proxy_set_header X-Forwarded-Proto: https;
}
当我尝试通过 Nginx 反向代理向我的 Tomcat 服务器请求时,我收到了 405 响应。
如果我直接请求 tomcat 服务器,它可以从 Chrome 或 Firefox 成功运行。但是,如果我请求 Nginx 代理,我会从 Chrome 获得 405,但在 Firefox 中有效。
我一直在 nginx.conf 下使用不同的配置进行测试 location/foo/ { ... }
我试过:
error_page 405 =200 $uri;
还有
add_header "Allow" "GET, POST, HEAD, PUT, DELETE" always;
add_header "Access-Control-Allow-Methods" "GET, POST, PUT, DELETE, OPTIONS" always;`
location / {
dav_methods PUT DELETE;
proxy_pass http://csprocure;
}
我的 nginx.conf 重定向如下:
upstream serverS {
server xxx.xxx.xxx.xxx:yyyy;
}
server {
listen 80;
server_name $hostname;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
error_log /dev/stdout info;
access_log /dev/stdout;
location /foo/ {
proxy_pass http://serverS;
proxy_redirect http://xxx.xxx.xxx.xxx/ http://xxx.xxx.xxx.xxx:yyyy/;
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 X-Forwarded-Host $server_name;
proxy_set_header X-Forwarded-Proto: https;
}
我可以在我的配置中添加什么来避免 Chrome 中的 405?
可以找到关于将 HTTP 方法列入白名单的很好的在线解释 here
这对我有用:
add_header Allow "GET, POST, HEAD, PUT, DELETE" always;
if ( $request_method !~ ^(GET|POST|HEAD|PUT|DELETE)$ ) {
return 405;
}
..显然,确保在测试更改前检查配置 nginx -t
并重新加载配置 nginx -s reload
我一直在比较 Firefox 和 Chrome 之间的请求,在 Chrome 方面存在差异,在请求 Chrome 中添加一个 "Origin" 参数header 请求出错。
所以在我的 nginx.conf 中,我添加了参数以避免它位于 location/
proxy_set_header Origin "";
所以我现在的位置配置块是:
location /foo/ {
proxy_set_header Origin "";
proxy_pass http://serverS;
proxy_redirect http://xxx.xxx.xxx.xxx/ http://xxx.xxx.xxx.xxx:yyyy/;
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 X-Forwarded-Host $server_name;
proxy_set_header X-Forwarded-Proto: https;
}