40

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などを書き換えるように明示的に指示せずに、これを任意のドメイン名で機能させたいと考えました。 。

4

7 に答える 7

62

ifNginxのドキュメントに記載されているように、可能な限りNginxでディレクティブを使用することは避けてください。構成に入るとすぐにif、サーバーはすべてのリクエストを評価して、それに一致するかどうかを判断する必要があるため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つの異なるオプションがあります。

  1. 各サーバーディレクティブが独自のIP(またはオプションの場合は異なるポート)をリッスンする複数のIPアドレスを設定します。このオプションには、 website.comwww.website.comの両方にSSL証明書が必要であるため、ワイルドカード証明書、UNI証明書(複数のドメイン)、または2つの異なる証明書のいずれかを使用できます。
  2. アプリケーションで書き換えを行います。
  3. 恐ろしいifディレクティブを使用してください。

SNIを使用するオプションもありますが、現時点でこれが完全にサポートされているかどうかはわかりません

于 2013-03-20T06:48:32.027 に答える
15
if ($host !~* ^www\.) {
    rewrite ^(.*)$ http://www.$host$1 permanent;
}
于 2009-11-06T23:01:21.240 に答える
14

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

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

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

于 2009-10-28T19:30:41.403 に答える
6
if ($host ~* ^[^.]+\.[^.]+$) {
    rewrite ^(.*)$ https://www.$host$1 permanent;
}

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

于 2010-09-22T06:55:11.207 に答える
4

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

于 2012-12-28T21:06:13.213 に答える
1

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 #
}
于 2019-03-24T01:12:19.757 に答える
0

私のためにnginx1.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;
}

この設定例では、書き換えたくない場合は、HTTPSでHTTPをさらに書き換えます—return文字列内のhttps://をhttp://に置き換えます。

プロトコルを維持したい場合—$scheme変数を使用します。

于 2019-07-11T15:55:20.920 に答える