我在 Apache 中有以下配置:
RewriteEngine On
#APP
ProxyPass /abc/ http://remote.com/abc/
ProxyPassReverse /abc/ http://remote.com/abc/
#APP2
ProxyPass /efg/ http://remote.com/efg/
ProxyPassReverse /efg/ http://remote.com/efg/
我正在尝试在 nginx 中使用相同的配置。阅读了一些链接后,我得到了以下信息:
server {
listen 8081;
server_name localhost;
proxy_redirect http://localhost:8081/ http://remote.com/;
location ^~/abc/ {
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://remote.com/abc/;
}
location ^~/efg/ {
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://remote.com/efg/;
}
}
我已经有以下配置:
server {
listen 8080;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
location ^~/myAPP {
alias path/to/app;
index main.html;
}
location ^~/myAPP/images {
alias another/path/to/images
autoindex on;
}
}
这里的想法是克服同源策略问题。主页位于 localhost:8080,但我们需要 ajax 调用来http://remote.com/abc。两个域名都在我的控制之下。
使用上述配置,ajax 调用要么无法到达远程服务器,要么因为跨源而被切断。
上述解决方案在 Apache 中有效,但在 nginx 中无效,因此我认为这是一个配置问题。
我认为这里有一个隐含的问题:我应该有两个server
声明还是应该以某种方式将它们合并为一个?
编辑:添加了更多信息
编辑2:我已将所有 proxy_pass 配置移至主server
声明中,并将所有 ajax 调用更改为通过端口 8080。我现在收到一个新错误:502 Connection reset by peer
。Wireshark 显示数据包发送到http://remote.comIP 头校验和不正确。
答案1
不工作不是特别详细,但让我试着猜测一下问题可能是什么。我建议尝试以下配置:
server {
listen 8081;
server_name localhost;
location /abc/ {
proxy_pass http://remote.com/abc/;
proxy_http_version 1.1;
proxy_redirect http://localhost:8081/ http://remote.com/;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /efg/ {
proxy_pass http://remote.com/efg/;
proxy_http_version 1.1;
proxy_redirect http://localhost:8081/ http://remote.com/;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
我真正改变的是位置块定义并添加了一个主持人标头,以防远程主机使用基于名称的虚拟主机。所有其他更改都是表面的 - 当所有相应的指令都聚集在一起并正确排序时(这可能是按重要性排序,或按其他特征排序),可读性会得到改善。
如果上述配置不能按预期工作,请添加一些信息,说明到底是什么不起作用以及具体是如何失败的。
编辑:我还添加了主持人标头添加到上述配置中,以防远程使用基于名称的虚拟主机。