web-dev-qa-db-ja.com

Nginxは、wwwプレフィックスのないドメインをwwwプレフィックスのあるドメインに書き換えます

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に明示的に指示せずに、これを任意のドメイン名で動作させたいと思いました。 。

39
saltycrane

とにかくxxx.xxxの形式のドメインのみをチェックしているので、外側の「if」ステートメントは実際には必要ないと思います。堅牢ではありませんが、次のように機能します。より良い解決策があれば教えてください。

    if ($Host ~* ^([a-z0-9\-]+\.(com|net|org))$) {
        set $Host_with_www www.$1;
        rewrite ^(.*)$ http://$Host_with_www$1 permanent;
    }

編集:ホスト名で有効な文字であるため、正規表現にハイフンを追加しました。

14
saltycrane
if ($Host !~* ^www\.) {
    rewrite ^(.*)$ http://www.$Host$1 permanent;
}
15
ss.
if ($Host ~* ^[^.]+\.[^.]+$) {
    rewrite ^(.*)$ http://www.$Host$1 permanent;
}

それ以外の場合、リクエストはサーバーに到達しないため、有効なホスト名を取得することしかできません。したがって、独自の検証ロジックを構築する必要はありません。

6
Anthony DiSanti

Nginxのドキュメントでは、書き換えにifを使用しないように注意しています。こちらのリンクをご覧ください: http://wiki.nginx.org/Pitfalls#Server_Name

4
Robert Brown

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 #
}
1
Andrei

私のために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変数を使用します。

0
irsi