2017-03-04 681 views
1

我的情况如下:与其它端口的Nginx重定向冲突

  • 应用程序1在运行:server.domain.com(192.168.1.3
  • 应用2在运行:server.domain。玉米:8080(192.168.1.2

我的路由器设置为路由请求在端口80到App 1和8080端口的应用程序2.

迄今为止这么好,这个场景一直在为工作

最近我尝试切换到nginx的,我决定到http流量重定向到https流量应用1.
我设置了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和应用程序1按预期工作。 试图访问的应用程序2我也将被重定向到HTTPS(它不应该,应用2不支持它)

现在我已经想通了为什么出现这种情况然而,当。
谷歌浏览器有缓存,所以当我访问非https网址时,它会将301重定向到https版本。它将它保存在缓存中,现在认为我总是希望https,而不管端口如何。

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

我已经试过遍布净几个默认的修复,但迄今为止他们都没有工作。

任何人都知道我必须把我的配置来解决这个问题?

PS:证书路径,域名和端口的实际情况

回答

0

首先假表示,如果在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上的服务器模块作为您在上面定义它只是一个重定向机到https,硬编码。您定义的这个块与您“将端口80上的请求路由到应用程序1”并且“将SSL用于应用程序1”的要求相矛盾,因为您的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服务。

+0

我指定的IP地址,以传达他们不在同一台服务器的事实,对不起,如果这不是太清楚。 理想情况下,我希望运行nginx的服务器忽略除app1的请求之外的任何内容。 (这将在端口80/443而不是端口8080) 我怀疑它只是这样做,但它发送一个301到chrome,将其放入其缓存,随后将所有其他端口重定向到https版本。 –

+0

谢谢你的澄清!此修复可能与更改chrome缓存为302的301(永久重定向)一样简单。有关详细信息,请访问http://superuser.com/questions/304589/how-can-i-make-chrome-stop-caching-重定向或http://superuser.com/questions/304589/how-can-i-make-chrome-stop-caching-redirects – quetzaluz

+0

对不起,这实际上是我的第一个想法,但它似乎也记得,以及:/ 让我再试一次,虽然可能已经犯了一个错误 –