Nginx 重定向 HTTPS、www、IPv6、HTTP2
我試圖避免 Nginx 中的重定向鏈,我將其用作 Apache 的反向代理。
我已經能夠找到大量關於重定向
HTTP
到HTTPS
.我還發現了大量關於重定向
www
到裸域(反之亦然)的文件。虛擬主機/網站(大部分)是我的主網站的子域,
example.com
.**背景:**我使用此配置是因為我最熟悉 Apache,但我很欣賞 Nginx 的性能改進,更重要的是,我在伺服器上執行了一個 NodeJS 應用程序,我希望使用者能夠在不附加的情況下訪問它請求的埠。Nginx 監聽 HTTP 埠 80 和 HTTPS 埠 443 並將請求路由到我配置 Apache 和 NodeJS 使用的埠(Apache 埠 8080 和 Node 埠 4000)。
**編輯:**我發現nginxconfig.io上的配置生成器工具非常有用,而且我從那裡得到的大部分內容都沒有改變。
對於“主”網站,我使用的是
www
子域,因此我需要將以下域重定向到https://www.example.com
:http://example.com http://www.example.com https://example.com
我能找到的所有東西似乎都可以在 2 個重定向中處理這個問題,例如:
http://example.com
到https://example.com
_https://www.example.com
這個問題的答案(實際上是
www
對裸域的重定向)使用了一個if
語句,但 Nginx 文件建議if
出於性能原因避免使用語句。問題 1 有沒有辦法在一個重定向中處理這些重定向,並且不會觸發有關具有重複伺服器名稱的塊的警告?
問題 2 當我為 80 埠設置塊時,如果我所做的只是重定向,我需要包含哪些參數?
我的
.conf
文件如下所示:server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name www.example.com; root /var/www/html/example.com; # SSL ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem; # security include nginxconfig.io/security.conf; # logging access_log /var/log/nginx/example.com.access.log; error_log /var/log/nginx/example.com.error.log warn; # index.html fallback location / { try_files $uri $uri/ /index.html; } # additional config include nginxconfig.io/general.conf; } # HTTP redirect server { listen 80; listen [::]:80; server_name example.com; include nginxconfig.io/letsencrypt.conf; location / { return 301 https://$server_name$request_uri; } }
我需要
include nginxconfig.io/letsencrypt.conf;
在埠 80 的塊中嗎?我是否需要在埠 80 的塊中
http2
的指令之後添加,listen
以便通過 HTTP 的 HTTP2 請求在仍然支持 HTTP2 的同時重定向到 HTTPS,或者僅http2
在 HTTPS/埠 443 的塊中包含指令就足夠了。的內容
nginxconfig.io/letsencrypt.conf
是:# ACME-challenge location ^~ /.well-known/acme-challenge/ { root /var/www/_letsencrypt; }
的內容
.../security.conf
是:add_header X-Frame-Options "SAMEORIGIN" always; add_header X-XSS-Protection "1; mode=block" always; add_header X-Content-Type-Options "nosniff" always; add_header Referrer-Policy "no-referrer-when-downgrade" always; #add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always; #add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; # . files location ~ /\.(?!well-known) { deny all; } location ~* (?:#.*#|\.(?:bak|conf|dist|fla|in[ci]|log|orig|psd|sh|sql|sw[op])|~)$ { deny all; }
我確實計劃最終實現 HSTS,但顯然,需要先整理好我的基本配置。
內容
.../general.conf
:# favicon.ico location = /favicon.ico { log_not_found off; access_log off; } # robots.txt location = /robots.txt { log_not_found off; access_log off; } # gzip gzip on; gzip_vary on; gzip_proxied any; gzip_comp_level 6; gzip_types text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml;
首選方法是有一個單獨的重定向,然後重定向
http://example.com
到.https://example.com``https://www.example.com
這是因為如何使用 HSTS 標頭。更多資訊在https://www.danielmorell.com/blog/how-to-configure-hsts-on-www-and-other-subdomains
為了適應這種情況,您需要更換:
server_name example.com;
和:
server_name example.com www.example.com;
在您的 HTTP
server
塊中。我假設它僅包含與 TLS 相關的設置,而 HTTP塊
letsencrypt.conf
中不需要這些設置。server
但是,這些設置需要應用於 HTTPSserver
塊。此外,您的
example.com
域需要 301 重定向:server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name example.com; # SSL ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem; include nginxconfig.io/letsencrypt.conf; return 301 https://www.example.com; }