Apache-2.2

Nginx HTTP 到 HTTPS 重定向不起作用

  • June 12, 2017

我正在執行一個 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 公用文件夾的位置。

誰能看到我在這裡缺少的東西?

您缺少server_name重定向伺服器塊。因此,nginx 上的實際虛擬主機選擇並不那麼清楚。

首先,您需要確保您有一個具有指令屬性的server塊。在此塊中,您可以定義伺服器在收到對未明確配置的主機的請求時會做什麼。default_server``listen

然後,您需要有這樣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 塊可以像現在一樣保留。

引用自:https://serverfault.com/questions/855277