Nginxは、wwwのないドメインをwwwのあるドメインに書き換えます
-
06-07-2019 - |
質問
Nginx HttpRewriteModuleのドキュメントには、wwwプレフィックスドメインを非wwwプレフィックスドメイン:
if ($host ~* www\.(.*)) {
set $host_without_www $1;
rewrite ^(.*)$ http://$host_without_www$1 permanent; # $1 contains '/foo', not 'www.mydomain.com/foo'
}
どのように逆にできますか?-wwwプレフィックスのないドメインをwwwプレフィックスのあるドメインに書き換えますか?次のようなことができるかもしれないと思ったが、Nginxはネストされたifステートメントを好まない。
if ($host !~* ^www\.) { # check if host doesn't start with www.
if ($host ~* ([a-z0-9]+\.[a-z0-9]+)) { # check host is of the form xxx.xxx (i.e. no subdomain)
set $host_with_www www.$1;
rewrite ^(.*)$ http://$host_with_www$1 permanent;
}
}
また、Nginxにdomain1.comを書き換えるように明示的に指示せずに、これがどのドメイン名でも機能するようにしたかった-> www.domain1.com、domain2.com->書き換えるドメインが多数あるため、www.domain2.comなど。
解決 3
まあ、私は本当に外側の「if」を必要としないと思います。とにかくxxx.xxxの形式のドメインのみをチェックしているためです。堅牢ではありませんが、次のように機能します。より良い解決策があれば教えてください。
if ($host ~* ^([a-z0-9\-]+\.(com|net|org))$) {
set $host_with_www www.$1;
rewrite ^(.*)$ http://$host_with_www$1 permanent;
}
編集:ホスト名で有効な文字であるため、正規表現にハイフンを追加しました。
他のヒント
Nginxのドキュメントに記載されているように、<可能であればNginxのcode> if ディレクティブ。これは、構成に if
が含まれるとすぐに、サーバーがすべてのリクエストを評価して、その< code> if かどうか。
より良い解決策は、複数のサーバーディレクティブです。
server {
listen 80;
server_name website.com;
return 301 $scheme://www.website.com$request_uri;
}
server {
listen 80;
server_name www.website.com;
...
}
SSL(HTTPS)対応サイトを提供しようとしている場合、3つの異なるオプションがあります。
- 各サーバーディレクティブが独自のIPをリッスンする複数のIPアドレスを設定します(それがオプションの場合は異なるポート)。このオプションには、 website.com と www.website.com の両方のSSL証明書が必要であるため、ワイルドカード証明書、UNI証明書(複数ドメイン)、または単純に2つの異なる証明書。
- アプリケーションで書き換えを行います。
- 恐ろしい
if
ディレクティブを使用します。
if ($host !~* ^www\.) {
rewrite ^(.*)$ http://www.$host$1 permanent;
}
if ($host ~* ^[^.]+\.[^.]+$) {
rewrite ^(.*)$ http://www.$host$1 permanent;
}
有効なホスト名のみを取得することは可能です。それ以外の場合、リクエストはサーバーに到達しないため、独自の検証ロジックを作成する必要はありません。
nginxのドキュメントでは、書き換えにifを使用しないように注意しています。こちらのリンクをご覧ください: http://wiki.nginx.org/Pitfalls#Server_Name
HTTP&amp; if条件のないHTTPS:
server {
listen 80;
listen 443;
server_name website.com;
return 301 $scheme://www.website.com$request_uri;
}
server {
listen 80;
listen 443 default_server ssl;
server_name www.website.com;
# Your config goes here #
}