web-dev-qa-db-ja.com

Nginxからwwwへ、およびwwwからno-wwwへ

チュートリアルに従ってRackspaceクラウドで nginxを使用しています ネットを検索したことがあるため、これまでのところソートできません。

私はwww.mysite.comがSEOやその他の理由で.htaccessで通常どおりmysite.comに行きたいと思います。

My /etc/nginx/sites-available/www.example.com.vhost config:

server {
       listen 80;
       server_name www.example.com example.com;
       root /var/www/www.example.com/web;

       if ($http_Host != "www.example.com") {
                 rewrite ^ http://example.com$request_uri permanent;
       }

私も試してみました

server {
       listen 80;
       server_name example.com;
       root /var/www/www.example.com/web;

       if ($http_Host != "www.example.com") {
                 rewrite ^ http://example.com$request_uri permanent;
       }

私も試しました。 2番目の試みは両方ともリダイレクトループエラーを与えます。

if ($Host = 'www.example.com' ) {
rewrite ^ http://example.com$uri permanent;
}

私のDNSは標準として設定されています。

site.com 192.192.6.8 A type at 300 seconds
www.site.com 192.192.6.8 A type at 300 seconds

(例IPおよびフォルダは例として、また将来人々を助けるために使用されてきました)。 Ubuntu 11を使います。

463
TheBlackBenzKid

HTTPソリューション

documentation から、「正しい方法はexample.orgのために別のサーバーを定義することです」:

server {
    listen       80;
    server_name  example.com;
    return       301 http://www.example.com$request_uri;
}

server {
    listen       80;
    server_name  www.example.com;
    ...
}

HTTPSソリューション

https://...を含むソリューションをご希望の方へ.

server {
        listen 80;
        server_name www.domain.com;
        # $scheme will get the http protocol
        # and 301 is best practice for tablet, phone, desktop and seo
        return 301 $scheme://domain.com$request_uri;
}

server {
        listen 80;
        server_name domain.com;
        # here goes the rest of your config file
        # example 
        location / {

            rewrite ^/cp/login?$ /cp/login.php last;
            # etc etc...

        }
}

注:ロードバランサを使用しており、https://サーバーはトラフィックの多いSSL支払いサーバーであるため、最初はhttps://をソリューションに含めていません。https://とhttp://を混在させることはありません。


Nginxのバージョンを確認するには、nginx -vを使用してください。

nginxリダイレクトを使用してURLからwwwを削除

server {
    server_name  www.domain.com;
    rewrite ^(.*) http://domain.com$1 permanent;
}

server {
    server_name  domain.com;
    #The rest of your configuration goes here#
}

だからあなたは2つのサーバーコードを持っている必要があります。

nginxリダイレクトでURLにwwwを追加

あなたが必要としているのが、domain.comからwww.domain.comにリダイレクトするという逆の場合、これを使用できます。

server {
    server_name  domain.com;
    rewrite ^(.*) http://www.domain.com$1 permanent;
}

server {
    server_name  www.domain.com;
    #The rest of your configuration goes here#
}

ご想像のとおり、これは正反対で、最初の例と同じように機能します。このように、あなたはそれが完全なパーマリダイレクトと移動であるので、あなたはSEOマークを下げることはありません。 no WWWが強制され、ディレクトリが表示されます。

見やすくするために、以下にいくつか私のコードを示します。

server {
    server_name  www.google.com;
    rewrite ^(.*) http://google.com$1 permanent;
}
server {
       listen 80;
       server_name google.com;
       index index.php index.html;
       ####
       # now pull the site from one directory #
       root /var/www/www.google.com/web;
       # done #
       location = /favicon.ico {
                log_not_found off;
                access_log off;
       }
}
766
TheBlackBenzKid

実際にはあなたも書き換える必要はありません。

server {
    #listen 80 is default
    server_name www.example.com;
    return 301 $scheme://example.com$request_uri;
}

server {
    #listen 80 is default
    server_name example.com;
    ## here goes the rest of your conf...
}

私の答えはますます上の投票を得ているが、上のものもそうだ。この文脈では決してrewriteを使ってはいけません。どうして? nginxは検索を処理して開始する必要があるためです。あなたがreturn(これはどのnginxバージョンでも利用可能であるべきです)を使用するなら、それは直接実行を停止します。これはいかなる状況においても好ましい。

非SSLとSSLの両方を非WWW版にリダイレクトします。

server {
    listen               80;
    listen               443 ssl;
    server_name          www.example.com;
    ssl_certificate      path/to/cert;
    ssl_certificate_key  path/to/key;

    return 301 $scheme://example.com$request_uri;
}

server {
    listen               80;
    listen               443 ssl;
    server_name          example.com;
    ssl_certificate      path/to/cert;
    ssl_certificate_key  path/to/key;

    # rest goes here...
}

サーバーがポート80(デフォルト)でしかlistenしておらず、listenオプションにhttpキーワードが含まれていない場合、$scheme変数に含まれるのはsslだけです。変数を使用しないとパフォーマンスは向上しません。

HSTSを使用する場合は、さらに多くのサーバーブロックが必要になります。これは、HSTSヘッダーが暗号化されていない接続で送信されるべきではないためです。したがって、リダイレクト付きの暗号化されていないサーバーブロックと、リダイレクトおよびHSTSヘッダー付きの暗号化されたサーバーブロックが必要です。

すべてSSLにリダイレクトします(IPv4、IPv6、SPDYなどのUNIX上の個人設定)。

#
# Redirect all www to non-www
#
server {
    server_name          www.example.com;
    ssl_certificate      ssl/example.com/crt;
    ssl_certificate_key  ssl/example.com/key;
    listen               *:80;
    listen               *:443 ssl spdy;
    listen               [::]:80 ipv6only=on;
    listen               [::]:443 ssl spdy ipv6only=on;

    return 301 https://example.com$request_uri;
}

#
# Redirect all non-encrypted to encrypted
#
server {
    server_name          example.com;
    listen               *:80;
    listen               [::]:80;

    return 301 https://example.com$request_uri;
}

#
# There we go!
#
server {
    server_name          example.com;
    ssl_certificate      ssl/example.com/crt;
    ssl_certificate_key  ssl/example.com/key;
    listen               *:443 ssl spdy;
    listen               [::]:443 ssl spdy;

    # rest goes here...
}

私はあなたが今自分でこのパターンを持つ他の化合物を想像できると思います。

私の設定の詳細? Go ここここ

377
Fleshgrinder

もっと多くのドメインに同じ設定を使いたいと思うかもしれません。

次のスニペットは、ドメインの前にwwwを削除します。

if ($Host ~* ^www\.(.*)$) {
    rewrite / $scheme://$1 permanent;
}
33
Martin Höger

2つのサーバーブロックが必要です。

これらをあなたの設定ファイルに入れてください。例えば/etc/nginx/sites-available/sitename

メインのアドレスとして http://example.com を使用することにしたとしましょう。

設定ファイルは次のようになります。

server {
        listen 80;
        listen [::]:80;
        server_name www.example.com;
        return 301 $scheme://example.com$request_uri;
}
server {
        listen 80;
        listen [::]:80;
        server_name example.com;

        # this is the main server block
        # insert ALL other config or settings in this server block
}

最初のサーバーブロックは、 'www'プレフィックスを持つリクエストをリダイレクトするための命令を保持します。それは、「www」という接頭辞を付けてリダイレクトしてURLの要求を待機します。

他には何もしません。

2番目のサーバーブロックはあなたのメインアドレス - あなたが使いたいURLを保持します。 rootindexlocationなど、他のすべての設定はここに入ります。サーバーブロックに含めることができるこれらの他の設定については、デフォルトファイルを確認してください。

サーバーには2つのDNS Aレコードが必要です。

Name: @ IPAddress: your-ip-address (for the example.com URL)

Name: www IPAddress: your-ip-address (for the www.example.com URL)

Ipv6の場合は、your-ipv6-addressを使用してAAAAレコードのペアを作成します。

26
Red

これは、wwwからnoまでの複数のサーバー名に対して行う方法です(私はこれをサブドメインに使用しました)。

server {
        server_name 
             "~^www\.(sub1.example.com)$"
             "~^www\.(sub2.example.com)$"
             "~^www\.(sub3.example.com)$";
         return 301 $scheme://$1$request_uri ;
}
23
Eric Johnson

この解決策は私の個人的な経験から来ています。 S3 "Host"ヘッダーポリシー に一致するようにnon-wwwwwwドメイン名にリダイレクトするために、いくつかのAmazon S3バケットと1つのサーバーを使用しました。

nginx serverには次の設定を使用しました。

server {
    listen 80;
    server_name ~^(?!www\.)(?<domain>.+)$;
    return 301 $scheme://www.$domain$request_uri;
}

これは、www.以外のもので始まり、サーバーを指すすべてのドメイン名と一致し、www.<domain>にリダイレクトします。同様に、wwwからnon-wwwへの逆のリダイレクトも可能です。

16
VisioN

ハードコーディングされたドメインを使わずに、すべての簡単な答えを組み合わせました。

301からwwwへの永久的なリダイレクト(HTTPまたはHTTPS):

server {
    if ($Host !~ ^www\.) {
        rewrite ^ $scheme://www.$Host$request_uri permanent;
    }

    # Regular location configs...
}

HTTPS以外、HTTPS以外、WWWを同時にリダイレクトしたい場合は、

server {
    listen 80;

    if ($Host !~ ^www\.) {
        rewrite ^ https://www.$Host$request_uri permanent;
    }

    rewrite ^ https://$Host$request_uri permanent;
}
14
Matt Janssen

これを試して

    if ($Host !~* ^www\.){
        rewrite ^(.*)$ https://www.yoursite.com$1;
    }

他の方法:wwwからNginxへ

server {
  listen       80;
  server_name  yoursite.com;
  root /path/;
  index index.php;
  return       301 https://www.yoursite.com$request_uri;
}

そしてwwwからno-wwwへ

server {
  listen       80;
  server_name  www.yoursite.com;
  root /path/;
  index index.php;
  return       301 https://yoursite.com$request_uri;
}
11
Kevin Nguyen

www以外のものをwwwにリダイレクトする

単一ドメインの場合

server {
        server_name example.com;
        return 301 $scheme://www.example.com$request_uri;
}

すべてのドメインの場合

server {
        server_name "~^(?!www\.).*" ;
        return 301 $scheme://www.$Host$request_uri;
}

wwwを非wwwにリダイレクト 単一ドメインの場合:

server {
        server_name www.example.com;
        return 301 $scheme://example.com$request_uri;
}

すべてのドメインの場合

server {
         server_name "~^www\.(.*)$" ;
         return 301 $scheme://$1$request_uri ;
}
10

ユニークなフォーマット:

server {
  listen 80;
  server_name "~^www\.(.*)$" ;
  return 301 https://$1$request_uri ;
}
8
Andriyun
  1. ベストプラクティス:ハードコードされたserver_nameを含む個別のservername__

Nginxのベストプラクティスは、このようなリダイレクトに別のservername__を使用し(メイン設定のservername__と共有しないで)、すべてをハードコードし、正規表現をまったく使用しないことです。

HTTPSを使用している場合は、ドメインをハードコードする必要もあります。なぜなら、どの証明書を提供するのかを事前に知っておく必要があるからです。

server {
    server_name www.example.com;
    return  301 $scheme://example.com$request_uri;
}
server {
    server_name www.example.org;
    return  301 $scheme://example.org$request_uri;
}
server {
    server_name example.com example.org;
    # real configuration goes here
}

  1. server_name内で正規表現を使用する

あなたがいくつかのサイトを持っていて、最も究極のパフォーマンスを気にしなくても、www.接頭辞に関してそれらのすべてに同じポリシーを持たせたいなら、あなたは正規表現を使うことができます。別のservername__を使用することをお勧めします。

Httpsを使用すると、この解決策は扱いにくくなります。これを正しく機能させるには、すべてのドメイン名をカバーする単一の証明書が必要になるためです。


すべてのサイトに専用の単一のwwwname__を使用した、正規表現のない非wwwname__からservername__:

server {
    server_name ~^(?!www\.)(?<domain>.+)$;
    return  301 $scheme://www.$domain$request_uri;
}

wwwname__からnon -wwwname__までのすべてのサイト用の専用のservername__で正規表現付き:

server {
    server_name ~^www\.(?<domain>.+)$;
    return  301 $scheme://$domain$request_uri;
}

wwwname__からnon -wwwname__へ、一部のサイトでは専用のservername__を使用します。

正規表現をいくつかのドメインだけをカバーするように制限する必要があるかもしれません、そしてあなたはwww.example.orgwww.example.comwww.subdomain.example.netだけにマッチするためにこのような何かを使うことができます:

server {
    server_name ~^www\.(?<domain>(?:example\.org|example\.com|subdomain\.example\.net))$;
    return  301 $scheme://$domain$request_uri;
}

Nginx付きの正規表現のテスト

システム上の pcretestNAME_ ライブラリで正規表現が期待通りに動作することをテストできます。これは、nginxが正規表現に使用するのとまったく同じ pcreNAME_ ライブラリです。

% pcretest 
PCRE version 8.35 2014-04-04

  re> #^www\.(?<domain>(?:example\.org|example\.com|subdomain\.example\.net))$#
data> test
No match
data> www.example.org
 0: www.example.org
 1: example.org
data> www.test.example.org
No match
data> www.example.com
 0: www.example.com
 1: example.com
data> www.subdomain.example.net
 0: www.subdomain.example.net
 1: subdomain.example.net
data> subdomain.example.net
No match
data> www.subdomain.example.net.
No match
data> 

"Host"ヘッダーに末尾のドットがある場合はnginxのサーバー名の正規表現 のように、nginxがすでに処理しているため、末尾のドットや大文字小文字の区別は不要です。


  1. 既存のifname__/HTTPS内にservername__を振りかけます。

この最終的な解決策は、一般的にはベストプラクティスとは見なされませんが、それでも機能し、機能します。

実際、HTTPSを使用している場合は、さまざまなservername__定義の間にたくさんのsslディレクティブをコピーアンドペーストする必要がなく、代わりにスニペットだけを配置することができるため、この最終的な解決策は保守が簡単になります。必要なサーバーにアクセスすると、サイトのデバッグと保守が簡単になります。


wwwname__からwwwname__まで:

if ($Host ~ ^(?!www\.)(?<domain>.+)$) {
    return  301 $scheme://www.$domain$request_uri;
}

wwwname__からnon -wwwname__へ:

if ($Host ~ ^www\.(?<domain>.+)$) {
    return  301 $scheme://$domain$request_uri;
}

単一の優先ドメインをハードコーディングする

もう少しパフォーマンスを向上させたい場合、および単一のservername__が使用する可能性がある複数のドメイン間の一貫性を希望する場合は、単一の優先ドメインを明示的にハードコードすることがやはり意味があります。

if ($Host != "example.com") {
    return  301 $scheme://example.com$request_uri;
}

参考文献:

5
cnst
location / { 
    if ($http_Host !~ "^www.domain.com"){ 
        rewrite ^(.*)$ $scheme://www.domain.com/$1 redirect; 
    } 
}
4
Maoz Zadok

誰かが301を返すのは正しいかもしれないことに気づいているかどうか確信が持てませんが、ブラウザはそれをするためにそれをチョークします

rewrite ^(.*)$ https://yoursite.com$1; 

より速いです:

return 301 $scheme://yoursite.com$request_uri;
3
steven

ゴーストブログ

nginxが推奨するreturn 301 $scheme://example.com$request_uri;の方法をGhostで動作させるには、メインサーバーブロックに追加する必要があります。

proxy_set_header    X-Real-IP           $remote_addr;
proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
proxy_set_header    Host                $http_Host;
proxy_set_header    X-Forwarded-Proto   $scheme;
proxy_set_header    X-NginX-Proxy       true;

proxy_pass_header   X-CSRF-TOKEN;
proxy_buffering     off;
proxy_redirect      off;  
2
nottinhill

ドメイン名をハードコードしたくない場合は、このリダイレクトブロックを使用できます。先頭のwwwがないドメインは、リダイレクトステートメントで再利用できる変数$domainとして保存されます。

server {
    ...
    # Redirect www to non-www
    if ( $Host ~ ^www\.(?<domain>.+) ) {
       rewrite ^/(.*)$ $scheme://$domain/$1;
    }
}

REF: サブドメインをnginxの正規表現でリダイレクトする

1
Drakes
if ($Host ~* ^www.example.com$) {
    return 301 $scheme://example.com$request_uri;
}
0
karadayi