gpt4 book ai didi

apache - Nginx 重定向与其他端口冲突

转载 作者:太空宇宙 更新时间:2023-11-03 13:35:09 26 4
gpt4 key购买 nike

我的情况如下:

  • 应用 1 运行于:server.domain.com (192.168.1.3)
  • 应用 2 运行于:server.domain.com:8080 (192.168.1.2)

我的路由器设置为将端口 80 上的请求路由到应用程序 1,将端口 8080 上的请求路由到应用程序 2。

到目前为止一切顺利,这个场景一直有效 多年

最近我尝试切换到 nginx,我决定将应用程序 1 的 http 流量重定向到 https 流量。
我使用 nginx 设置了一个容器并使用了以下配置:

server {
listen 80 default_server;
server_name _;
return 301 https://$host$request_uri;
}

# main server block
server {
listen 443 ssl default_server;

root /config/www;
index index.html index.htm index.php;

server_name _;

ssl_certificate /path to cert;
ssl_certificate_key /path to cert;
ssl_dhparam /path to cert;
ssl_ciphers '';
ssl_prefer_server_ciphers on;

client_max_body_size 0;

location / {
try_files $uri $uri/ /index.html /index.php?$args =404;
}

location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# With php7-cgi alone:
fastcgi_pass 127.0.0.1:9000;
# With php7-fpm:
#fastcgi_pass unix:/var/run/php7-fpm.sock;
fastcgi_index index.php;
include /etc/nginx/fastcgi_params;
}

}

这成功地将 http 重定向到 https,app 1 按预期工作。但是,当尝试访问应用程序 2 时,我也会被重定向到 https(不应该,应用程序 2 不支持它)

现在我已经弄明白了为什么会发生这种情况。
谷歌浏览器有一个缓存,所以当我访问非 https url 时,它会得到一个 301 重定向到 https 版本。它将它保存在它的缓存中,现在认为无论端口如何,我总是想要 https。

我发现的解决方法是转到 chrome://net-internals 并清除那里的缓存。打开应用程序 2 然后成功,但在访问应用程序 1 后,我再次陷入同一个循环。

我已经尝试了几个在网上找到的默认修复程序,但到目前为止它们都没有用。

有人知道我必须在我的配置中添加什么来解决这个问题吗?

ps:证书路径、域名和端口都是真实情况的假象

最佳答案

首先,如果在 nginx 配置中标记哪个服务器定义对应于应用程序 1 和应用程序 2,这将很有帮助,因为看起来配置中可能存在混淆。您还缺少一些配置,例如监听端口 8080。因此,首先我将澄清您对这两个应用明确说明的要求:

应用 1:

  • 监听80端口
  • 使用 SSL

应用 2:

  • 监听 8080 端口
  • 不使用 SSL/不支持它。

所以我建议配置更接近:

# Corresponds better to app 2 given your requirements
server {
listen 8080 default_server;
server_name _;

# NOTE: You may want to listen for certain routes, without redirect EG
# location /foo/* { . . . }

return 301 $scheme://$host$request_uri;
}

# main server block - app 1
server {
listen 443 ssl default_server;

. . . # The rest of your definition here is fine for an SSL server
}

我在这里的主要观点是,您在上面定义的端口 80 上的服务器 block 只是硬编码的重定向机器到 https。您定义的这个 block 与您“将端口 80 上的请求路由到应用程序 1”和“对应用程序 1 使用 SSL”的要求相矛盾,因为您的 SSL 配置实际上在第二个服务器定义中。您在第一个服务器定义中设置的实际上是用于 force ssl redirects 的模式让您处于永远不会提供非 SSL HTTP 流量的位置。这可能会稍微解决这个问题;一旦服务器 block 更符合规定的要求,也许我可以提供更多帮助。

最后注意到可以在一个服务器定义 block 中监听多个端口并路由到 http 和 https 流量:

server {
listen 80;
listen 443 ssl;
# can force some routes to be ssl or non ssl accordingly
}

如果两个应用服务器都托管在使用相同 nginx 服务的同一台机器上,这样的配置可能更理想。

关于apache - Nginx 重定向与其他端口冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42599938/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com