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

标签 apache ssl redirect nginx

我的情况如下:

  • 应用 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/

相关文章:

java - 使用 apache POI 在 IDE 中无法识别 workbook.createSheet() 方法

sql-server - PHP警告: PHP Startup: Unable to load dynamic library 'C:\\Users\\Public\\xampp\\php\\ext\\php_sqlsrv_56_ts.dll'

linux - 不区分大小写的重写规则

python - 请求无法连接到 TLS 服务器

asp.net - FormsAuthentication.RedirectFromLoginPage 与 Response.Redirect

php - Apache 重写规则强制下载

java - 如何嗅探 SSL 保护的 Metro Web 服务和 WCF 客户端之间的通信?

ssl - 如何使用我拥有的有效 SSL 证书在 https 中通过 pm2 服务器为 React 应用程序提供服务?

Perl WWW::Mechanize(或 LWP)获取重定向 url

php - htaccess 重定向到 "https://www."