我使用 Nginx 作为反向代理。我假设我有一个类似 test.com 的域名和一个带有类似 /test 路径的位置块。该位置将通过 proxy_pass 传递到另一个网站,例如http://test2.com。当我在浏览器上输入 URL 时,它会将第一个请求重定向到应用程序(http://test.com/测试/-->http://test2.com/)。但是,所有传入请求都将在不包含我在 Nginx 上定义的位置的情况下发送。我怎样才能让所有传入请求都遵循该路径?我想要这样的东西:
第一个请求:http://test.com/测试/-->http://test.com
http://test.com/test/api/something等等...
server { listen 80; charset utf-8; server_name test.com; location = /auth/test{ internal; proxy_pass http://test.com/test/decisions/; proxy_pass_request_body off; proxy_set_header Content-Length ''; proxy_set_header X-Original-URI $request_uri; } location = /test/decisions/ { 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-Proto $scheme; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $http_connection; proxy_set_header Authorization $http_authorization; proxy_pass http://valid.domain/test/api/authorization; } location /test/ { auth_request /auth/test; auth_request_set $auth_status $upstream_status; 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-Proto $scheme; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $http_connection; proxy_set_header Authorization $http_authorization; proxy_pass https://test2.com/; proxy_pass_header Server; proxy_http_version 1.1; proxy_redirect default; access_log /var/log/nginx/access.log; client_max_body_size 10240M; } }
答案1
这里的“传入请求”一词令人困惑。我假设你的意思是:
- 浏览器向 发出请求
http://example.com/test/
,由 nginx 代理至http://2.example.com/
。 http://2.example.com/statfile.js
当你希望向以下对象发出请求时,浏览器会直接向以下对象发出后续请求:http://example.com/test/statfile.js
对于此问题陈述,最佳解决方案是修改2.example.com
服务器配置,使其创建指向 的 URL,example.com/test
而不是指向 的 URL 2.example.com
。通常,Web 应用程序中有一个可以修改的根 URL 设置。
可靠性较低且性能较差的选项是使用sub_filter
模块来替换块中出现的所有2.example.com
with 。example.com/test/
proxy_pass
然而,这可能会产生意想不到的副作用。