Nginx HTTP 到 HTTPS 重定向不起作用

Nginx HTTP 到 HTTPS 重定向不起作用

我正在运行一个 Redmine 实例,它使用 nginx 进行 SSL 连接并使用 apache 提供内容服务。

我正在通过在新机器上安装最新版本来升级它,一旦一切正常,我将复制文件和数据库。

我已经将 apache 和 nginx 的配置从现有机器复制到新机器,但两台机器上的结果不同,我不知道原因。

在当前生产实例中,Redmine 在端口 18804 上运行(这是我老板的规定)。目前,当有人使用浏览器访问 redmine.mydomain.com 时,他们会使用 HTTPS 自动重定向到 Redmine。无论末尾是否附加 :18804,都会发生这种情况,这正是我希望它如何运行。

但是在新机器上,如果我在浏览器中输入 newredmine.mydomain.com,我会被重定向到 nginx 测试页面。但是,如果我输入 newredmine.mydomain.com:18804,或者https://newredmine.mydomain.com,然后我将使用 HTTP 路由到该应用程序。

我需要通过输入逻辑 URL 来实现这一点。显然,重定向到 HTTPS 不起作用,但由于配置是精确的副本,我不明白为什么。

当前服务器运行的是 Amazon Linux、Apache 2.2.31 和 nginx 1.10.2。新服务器运行的是 Centos 7、Apache 2.4.6 和 nginx 1.10.2。

这是我的应用程序的 nginx 配置:

upstream redmine {

        server 127.0.0.1:18805;

}


server {

        listen 18804;

        location / {

                return 301 https://$host$request_uri;

        }

}




server {

        listen 80;

        location / {

                return 301 https://$host$request_uri;

        }

}



server {

        listen 443 ssl;

        server_name application.mydomain.com;



        access_log /var/log/nginx/redmine.access.log;

        error_log /var/log/nginx/redmine-errors.log;



        ssl on;

        ssl_certificate_key /etc/ssl/private/key;

        ssl_certificate /etc/ssl/certs/crt;

        ssl_ciphers RC4:HIGH:!aNULL:!MD5;

        ssl_prefer_server_ciphers on;





        client_max_body_size 0;



        location / {

                proxy_set_header Host $host;

                proxy_set_header X-Real-IP $remote_addr;

                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

                proxy_pass http://redmine;

        }

}

如果需要的话,我的服务器将从 Apache 中阻止:

# Redmine 3.3.3

<VirtualHost *:18805>
  DocumentRoot /var/www/html/redmine/public
  ServerName newredmine.mydomain.com
  ServerAlias 127.0.0.1
  ErrorDocument 503 /maintenance.html
  RewriteEngine on
  RewriteCond %{DOCUMENT_ROOT}/../tmp/stop.txt -f
  RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
  RewriteRule ^(.*)$ /$1 [R=503,L]

<Directory /var/www/html/redmine/public/>
  AllowOverride all
  # MultiViews must be turned off.
  Options -MultiViews
</Directory>

  ErrorLog logs/redmine_3.3.3_log

正如我所说,真正令人困惑的是,尽管两个实例的配置相同,但其行为却不同。唯一的区别是您可以预料到的,例如 Redmine 公共文件夹的位置。

有人能看到我这里遗漏了什么吗?

答案1

您缺少server_name重定向服务器块。因此,nginx 上的实际虚拟主机选择并不那么清晰。

首先,您需要确保有一个块在指令上server具有属性。在此块中,您可以定义服务器在收到未明确配置的主机请求时执行的操作。default_serverlisten

然后,您需要有server类似这样的块来进行重定向:

server {
    listen 18804;
    server_name redmine.mydomain.com;

    return 301 https://redmine.mydomain.com$uri;
}

server {
    listen 80;
    server_name redmine.mydomain.com;

    return 301 https://redmine.mydomain.com$uri;
}

最好在return指令中使用明确的域名,因为$host变量在某些时候可能包含非所需的值。

SSL 块可以保持现在的样子。

相关内容