質問

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つの異なるオプションがあります。

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

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

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 #
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top