Nginx

Nginx 重定向 HTTPS、www、IPv6、HTTP2

  • December 21, 2019

我試圖避免 Nginx 中的重定向鏈,我將其用作 Apache 的反向代理。

我已經能夠找到大量關於重定向HTTPHTTPS.

我還發現了大量關於重定向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.comhttps://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;

在您的 HTTPserver塊中。

我假設它僅包含與 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;
}

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