536

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

SEO などの理由で、www.mysite.com から .htaccess で通常どおり mysite.com にアクセスできるようにしたい。

私の/etc/nginx/sites-available/www.example.com.vhost設定:

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 とフォルダの例は、例として、また将来の人々を助けるために使用されています)。Ubuntu11を使用しています。

4

17 に答える 17

819

HTTP ソリューション

ドキュメントから、「正しい方法は、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://ロードバランサーを使用しており、https:// サーバーは高トラフィックの SSL 支払いサーバーであるため、当初はソリューションに含めていませんでした。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;
       }
}
于 2011-10-31T19:18:07.033 に答える
424

実際には、書き直す必要すらありません。

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オプションにキーワードが含まれていない場合にのみ、$scheme変数に含まれます。変数を使用しないと、パフォーマンスは向上しません。httpssl

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...
}

このパターンを持つ他の化合物を自分で想像できると思います。

私の設定の詳細?ここここに行きます。

于 2012-07-31T04:58:55.247 に答える
45

より多くのドメインに同じ構成を使用したい場合があります。

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

if ($host ~* ^www\.(.*)$) {
    rewrite / $scheme://$1 permanent;
}
于 2015-05-14T14:46:18.863 に答える
16

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

nginxサーバーには次の構成を使用しました。

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

これは、サーバーを指しているすべてのドメイン名に一致しwww.ますwww.<domain>www同様に、 からへの反対のリダイレクトを行うことができますnon-www

于 2015-10-16T15:44:33.490 に答える
12

これを試して

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

他の方法: Nginx no-www to www

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

とwwwからないwww

server {
  listen       80;
  server_name  www.yoursite.com;
  root /path/;
  index index.php;
  return       301 https://yoursite.com$request_uri;
}
于 2013-10-08T17:18:22.863 に答える
9

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

server {
  listen 80;
  server_name "~^www\.(.*)$" ;
  return 301 https://$1$request_uri ;
}
于 2015-02-19T16:01:47.947 に答える
6

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

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

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

于 2019-02-25T01:39:10.520 に答える
5
location / { 
    if ($http_host !~ "^www.domain.com"){ 
        rewrite ^(.*)$ $scheme://www.domain.com/$1 redirect; 
    } 
}
于 2016-05-23T17:09:50.897 に答える
-6

これが機能しない場合は、サーバーの IP アドレスを追加する必要がある場合があります。例えば:

server {
listen XXX.XXX.XXX.XXX:80;
listen XXX.XXX.XXX.XXX:443 ssl;
ssl_certificate /var/www/example.com/web/ssl/example.com.crt;
ssl_certificate_key /var/www/example.com/web/ssl/example.com.key;
server_name www.example.com;
return 301 $scheme://example.com$request_uri;
}

ここで、XXX.XXX.XXX.XXX は IP アドレスです (当然)。

注: https 要求を適切にリダイレクトするには、ssl crt とキーの場所を定義する必要があります

変更を行った後、nginx を再起動することを忘れないでください。

service nginx restart
于 2013-10-28T19:14:25.440 に答える