Nginx重定向与其他端口

时间:2017-03-04 18:48:54

标签: apache ssl redirect nginx

我的情况如下:

  • app 1运行于:server.domain.com( 192.168.1.3
  • app 2运行于:server.domain.com:8080( 192.168.1.2

我的路由器设置为将端口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:证书路径,域名和端口是真实情况的虚假陈述

1 个答案:

答案 0 :(得分:0)

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

应用1:

  • 收听端口80
  • 使用SSL

App 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和#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服务托管在同一台计算机上,那么这样的配置可能会更理想。