Nginx HttpRewriteModule documentation には、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;
}
}
また、書き換えるドメインが多数あるため、domain1.com-> www.domain1.com、domain2.com-> www.domain2.comなどを書き換えるようにNginxに明示的に指示せずに、これを任意のドメイン名で動作させたいと思いました。 。
とにかくxxx.xxxの形式のドメインのみをチェックしているので、外側の「if」ステートメントは実際には必要ないと思います。堅牢ではありませんが、次のように機能します。より良い解決策があれば教えてください。
if ($Host ~* ^([a-z0-9\-]+\.(com|net|org))$) {
set $Host_with_www www.$1;
rewrite ^(.*)$ http://$Host_with_www$1 permanent;
}
編集:ホスト名で有効な文字であるため、正規表現にハイフンを追加しました。
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
If条件のないHTTPおよび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 #
}
私のためにnginx 1.17に取り組んでいる複数のドメインのソリューション:
server {
listen 80;
server_name .example.com;
set $Host_with_www $Host;
if ($Host !~* www\.(.*)) {
set $Host_with_www www.$Host;
}
return 301 https://$Host_with_www$request_uri;
}
この構成例では、return
文字列でhttps://をhttp://に置き換えて書き換える必要がない場合は、HTTPSでHTTPをさらに書き換えます。
プロトコルを保持する場合— $scheme
変数を使用します。