Nginx

Nginx 阻止多個域將所有流量重定向到 https?

  • January 6, 2022

我有一台執行 nginx 1.6 的 Web 伺服器,它有一個 IP 地址並託管 www.domainname.com 和 dev.domainname.com。

我正在嘗試找到一種將所有 http 流量路由到 https 的智能方法,並且我想確保我的預設伺服器是當時的“www”實時版本。所以最終目標是除非使用者指定https://dev.domainname.com ,否則他們將被重定向到https://www.domainname.com

我的 nginx.conf 設置配置為包含“/etc/nginx/etc/sites-enabled/*”。所以我的配置範例位於’etc/nginx/sites-enabled/www.domainname.com’。

另外,澄清一下。當您訪問沒有 www 的域時,我目前的配置在載入開發站點時出現問題。

編輯:我只是在本地嘗試了這種方法,並且在’/etc/nginx/sites-enabled/‘中不允許使用http和https。是否有更好的解決方案或者我應該將此配置移動到 nginx.conf 中?*

所以我的問題是有更好的方法來處理這種類型的設置嗎?

http {

# all traffic should be over https
listen 80 default;

# listen for all server names
server_name *.domainname.com;

# redirect to www with https
return 301 $scheme://www.domainname.com$request_uri;

}

https {

# configuration for all https sites
listen 443 default ssl;
ssl on;

index index.html index.htm index.php;

charset utf-8;

location / {
   try_files $uri $uri/ /index.php?$query_string;
}

location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt  { access_log off; log_not_found off; }

access_log off;

error_page 404 /index.php;

location ~ \.php$ {
   fastcgi_split_path_info ^(.+\.php)(/.+)$;
   fastcgi_pass unix:/var/run/php5-fpm.sock;
   fastcgi_index index.php;
   include fastcgi_params;
}

location ~ /\.ht {
   deny all;
}

# configuration for the non-www redirect
server {

   # non-www server name
   server_name domainname.com;
   # return to www
   return 301 $scheme://www.domainname.com$request_uri;

}

# configuration for the live website
server {

   # www server name
   server_name www.domainname.com;

   # root to public directory
   root /path/to/www.domainname.com/public;

   # ssl certificates
   ssl_certificate /etc/nginx/ssl/www.domainname.com/ssl-bundle.crt;
   ssl_certificate_key /etc/nginx/ssl/www.domainname.com/server.key;

   # error logs for www site
   error_log  /var/log/nginx/www.domainname.com-error.log error;

}

# configuration for the dev site
server {

   # dev server name
   server_name dev.domainname.com;

   # root to public directory
   root /path/to/dev.domainname.com/public;

   # ssl certificates - using multi domain ssl
   ssl_certificate /etc/nginx/ssl/www.domainname.com/ssl-bundle.crt;
   ssl_certificate_key /etc/nginx/ssl/www.domainname.com/server.key;

   # error logs for dev site
   error_log  /var/log/nginx/dev.domainname.com-error.log error;

}

}

如果您的發行版是基於 Debian 的,那麼您已經sites-available/default安裝了文件。那是為 nginx 配置預設頁面的文件。

你需要通過執行它的符號連結來禁用這個虛擬主機rm sites-enabled/default

然後,您需要default使用以下內容新建一個:

server {
   listen 80 default_server;
   listen 443 default_server ssl;
   server_name _;

   ssl_certificate /path/to/your/certificate;
   ssl_certificate_key /path/to/your/key;

   redirect 301 https://www.domainname.com$request_uri;
}

此塊可確保對未在任何地方列出的其他域的所有請求都重定向到https://www.domainname.com

然後,製作另一個文件,例如dev.domainname.com

server {
   listen 443 ssl;

   server_name dev.domainname.com;

   ssl_certificate /path/to/your/certificate;
   ssl_certificate_key /path/to/your/key;

   # Other config for dev.domainname.com
}

此塊處理對dev.domainname.com.

最後,www.domainname.com

server {
   listen 443 ssl;

   server_name www.domainname.com;

   ssl_certificate /path/to/your/certificate;
   ssl_certificate_key /path/to/your/key;

   # Other config for www.domainname.com
}

這個塊處理對www.domainname.com.

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