チュートリアルに従って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を使います。
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://
...を含むソリューションをご希望の方へ.
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;
}
}
実際にはあなたも書き換える必要はありません。
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...
}
私はあなたが今自分でこのパターンを持つ他の化合物を想像できると思います。
もっと多くのドメインに同じ設定を使いたいと思うかもしれません。
次のスニペットは、ドメインの前にwwwを削除します。
if ($Host ~* ^www\.(.*)$) {
rewrite / $scheme://$1 permanent;
}
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を保持します。 root
、index
、location
など、他のすべての設定はここに入ります。サーバーブロックに含めることができるこれらの他の設定については、デフォルトファイルを確認してください。
サーバーには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レコードのペアを作成します。
これは、wwwからnoまでの複数のサーバー名に対して行う方法です(私はこれをサブドメインに使用しました)。
server {
server_name
"~^www\.(sub1.example.com)$"
"~^www\.(sub2.example.com)$"
"~^www\.(sub3.example.com)$";
return 301 $scheme://$1$request_uri ;
}
この解決策は私の個人的な経験から来ています。 S3 "Host"ヘッダーポリシー に一致するようにnon-www
をwww
ドメイン名にリダイレクトするために、いくつかの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
への逆のリダイレクトも可能です。
ハードコーディングされたドメインを使わずに、すべての簡単な答えを組み合わせました。
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;
}
これを試して
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;
}
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 ;
}
ユニークなフォーマット:
server {
listen 80;
server_name "~^www\.(.*)$" ;
return 301 https://$1$request_uri ;
}
server_name
を含む個別のserver
name__Nginxのベストプラクティスは、このようなリダイレクトに別のserver
name__を使用し(メイン設定のserver
name__と共有しないで)、すべてをハードコードし、正規表現をまったく使用しないことです。
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
}
server_name
内で正規表現を使用するあなたがいくつかのサイトを持っていて、最も究極のパフォーマンスを気にしなくても、www.
接頭辞に関してそれらのすべてに同じポリシーを持たせたいなら、あなたは正規表現を使うことができます。別のserver
name__を使用することをお勧めします。
Httpsを使用すると、この解決策は扱いにくくなります。これを正しく機能させるには、すべてのドメイン名をカバーする単一の証明書が必要になるためです。
www
name__を使用した、正規表現のない非www
name__からserver
name__:server {
server_name ~^(?!www\.)(?<domain>.+)$;
return 301 $scheme://www.$domain$request_uri;
}
www
name__からnon -www
name__までのすべてのサイト用の専用のserver
name__で正規表現付き:server {
server_name ~^www\.(?<domain>.+)$;
return 301 $scheme://$domain$request_uri;
}
www
name__からnon -www
name__へ、一部のサイトでは専用のserver
name__を使用します。正規表現をいくつかのドメインだけをカバーするように制限する必要があるかもしれません、そしてあなたはwww.example.org
、www.example.com
とwww.subdomain.example.net
だけにマッチするためにこのような何かを使うことができます:
server {
server_name ~^www\.(?<domain>(?:example\.org|example\.com|subdomain\.example\.net))$;
return 301 $scheme://$domain$request_uri;
}
システム上の pcretest
NAME_ ライブラリで正規表現が期待通りに動作することをテストできます。これは、nginxが正規表現に使用するのとまったく同じ pcre
NAME_ ライブラリです。
% 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がすでに処理しているため、末尾のドットや大文字小文字の区別は不要です。
if
name__/HTTPS内にserver
name__を振りかけます。この最終的な解決策は、一般的にはベストプラクティスとは見なされませんが、それでも機能し、機能します。
実際、HTTPSを使用している場合は、さまざまなserver
name__定義の間にたくさんのsslディレクティブをコピーアンドペーストする必要がなく、代わりにスニペットだけを配置することができるため、この最終的な解決策は保守が簡単になります。必要なサーバーにアクセスすると、サイトのデバッグと保守が簡単になります。
www
name__からwww
name__まで:if ($Host ~ ^(?!www\.)(?<domain>.+)$) {
return 301 $scheme://www.$domain$request_uri;
}
www
name__からnon -www
name__へ:if ($Host ~ ^www\.(?<domain>.+)$) {
return 301 $scheme://$domain$request_uri;
}
もう少しパフォーマンスを向上させたい場合、および単一のserver
name__が使用する可能性がある複数のドメイン間の一貫性を希望する場合は、単一の優先ドメインを明示的にハードコードすることがやはり意味があります。
if ($Host != "example.com") {
return 301 $scheme://example.com$request_uri;
}
location / {
if ($http_Host !~ "^www.domain.com"){
rewrite ^(.*)$ $scheme://www.domain.com/$1 redirect;
}
}
誰かが301を返すのは正しいかもしれないことに気づいているかどうか確信が持てませんが、ブラウザはそれをするためにそれをチョークします
rewrite ^(.*)$ https://yoursite.com$1;
より速いです:
return 301 $scheme://yoursite.com$request_uri;
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;
ドメイン名をハードコードしたくない場合は、このリダイレクトブロックを使用できます。先頭のwwwがないドメインは、リダイレクトステートメントで再利用できる変数$domain
として保存されます。
server {
...
# Redirect www to non-www
if ( $Host ~ ^www\.(?<domain>.+) ) {
rewrite ^/(.*)$ $scheme://$domain/$1;
}
}
if ($Host ~* ^www.example.com$) {
return 301 $scheme://example.com$request_uri;
}