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 公用文件夾的位置。
誰能看到我在這裡缺少的東西?
您缺少
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 塊可以像現在一樣保留。