我的情况如下:
我的路由器设置为将端口80上的请求路由到app 1,将端口8080路由到app 2。
到目前为止,这个场景一直在工作。
最近我尝试切换到nginx,我决定将http流量重定向到应用1的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网址时,它会获得301重定向到https版本。它将此保存在它的缓存中,现在认为我总是想要https而不管端口。
我找到的解决方法是使用chrome:// net-internals并清除那里的缓存。然后打开应用程序2成功,但在访问应用程序1后,我再次在同一个循环中结束。
我已经尝试过在网络上找到的几个默认修复程序,但到目前为止还没有一个有效。
任何人都知道我必须在配置中添加什么来解决这个问题?
ps:证书路径,域名和端口是真实情况的虚假陈述
答案 0 :(得分:0)
首先,如果在nginx配置中标记哪个服务器定义对应于App 1和App 2,那将是有用的,因为它看起来可能在配置中混淆。您还缺少一些配置,例如收听8080端口。首先,我将澄清您为这两个应用明确说明的要求:
应用1:
App 2:
所以我建议配置更接近:
# 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上的服务器阻塞只是一个重定向到https的硬盘编码器。您已定义的此块与您将端口80上的请求路由到应用1和#34;的要求相矛盾。而你"对应用1"使用SSL因为您的SSL配置实际上在第二个服务器定义中。您在第一个服务器定义中设置的实际上是用于force ssl redirects的模式,使您处于一个您永远不会提供非ssl HTTP流量的位置。这有点可以解决这个问题;也许一旦服务器阻塞更符合规定的要求,我就可以提供更多帮助。
最后注意到可以在一个服务器定义块中侦听多个端口并路由到http和https流量:
server {
listen 80;
listen 443 ssl;
# can force some routes to be ssl or non ssl accordingly
}
如果这两个应用服务器使用相同的nginx服务托管在同一台计算机上,那么这样的配置可能会更理想。