Nginx反向代理加载外部网站到子目录失败,求配置修正方案
修复Nginx反向代理外部网站到子目录的404问题
你的配置核心问题是:访问https://localhost:9091/looker时,Nginx会把完整路径/looker转发给谷歌服务器,但谷歌根本没有/looker这个路径,所以返回404。下面是修复后的完整配置,以及关键修改说明:
worker_processes 2; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events {} http { upstream keepalive-upstream { server google.com:443; keepalive 64; } server { listen 9091 ssl; ssl_certificate /etc/ssl/nginx-selfsigned.crt; ssl_certificate_key /etc/ssl/nginx-selfsigned.key; location /looker { # 末尾加/,让Nginx去掉/looker前缀后转发到谷歌根路径 proxy_pass https://keepalive-upstream/; proxy_http_version 1.1; proxy_ssl_server_name on; proxy_buffering off; proxy_set_header Accept-Encoding ""; proxy_set_header Host google.com; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 替换页面中所有谷歌域名的引用为本地子目录 sub_filter "https://google.com" "https://localhost:9091/looker"; sub_filter "//google.com" "//localhost:9091/looker"; # 替换页面中根路径开头的资源引用为子目录路径 sub_filter 'href="/' 'href="/looker/'; sub_filter 'src="/' 'src="/looker/'; sub_filter_types *; sub_filter_once off; # 修正Cookie的域名和路径,适配子目录 proxy_cookie_domain google.com localhost:9091; proxy_cookie_path / /looker/; } location / { root /www; } } }
关键修改点说明
proxy_pass末尾加/:这是核心,没有这个/的话,Nginx会把/looker原封不动传给谷歌;加了之后,Nginx会把请求路径中/looker后面的部分(这里是空)转发到谷歌的/路径,也就是请求谷歌首页。- 扩展
sub_filter规则:谷歌页面里的资源、链接都是指向自身域名或者根路径的,必须全部替换成你的子目录路径,否则页面会加载谷歌的原始资源,甚至跳转到谷歌官网。 - Cookie适配:谷歌返回的Cookie域名是
google.com,浏览器不会在localhost:9091下保存,所以需要用proxy_cookie_domain和proxy_cookie_path修改Cookie的属性,确保会话正常。
测试步骤
- 保存修改后的配置文件
- 执行
nginx -t检查配置语法是否正确 - 执行
nginx -s reload重启Nginx生效 - 访问
https://localhost:9091/looker,查看页面是否正常加载,打开浏览器开发者工具检查资源请求路径是否都已替换为/looker/开头
内容的提问来源于stack exchange,提问作者user3006967
相关产品推荐
相关产品推荐

