Nginxのhttpとhttpsの両方のルートドメインを同じサブディレクトリ(https)にリダイレクトしようとしています:
だから例えば.
http://example.com -> https://example.com/subdirectory
https://example.com -> https://example.com/subdirectory
これは私には単純に思えましたが、私はこれを達成するのに苦労しています。さまざまな書き換えを使用して301を返すようにしましたが、常にリダイレクトループが発生します。
私の現在の設定(ループの原因):
server {
listen 80;
server_name example.com;
return 301 https://$server_name/subdirectory;
}
server {
listen 443 ssl spdy;
server_name example.com;
return 301 https://$server_name/subdirectory;
}
したがって、基本的に、ルートドメインがhttp経由で要求されているかhttps経由で要求されているかに関係なく、ルートドメインからhttps上の同じサブディレクトリにリダイレクトしようとしています。
この構成はあなたが望むことをします:
server {
listen 80:
server_name example.com;
return 301 https://$server_name/subdirectory;
}
server {
listen 443;
server_name example.com;
location = / {
return 301 https://$server_name/subdirectory;
}
}
= /
指定子は完全一致を意味するため、仮想サーバーの完全なルートURIのみに一致します。
いくつかの「微調整」を伴う別のアプローチ...
server {
access_log /var/log/nginx/<DOMAIN_NAME>-access.log;
error_log /var/log/nginx/<DOMAIN_NAME>-error.log;
listen <PORT_PROXY>;
server_name <DOMAIN_NAME>;
location /<SUBDIRECTORY> {
proxy_pass http://<RESOURCE_IP>:<RESOURCE_PORT>/<SUBDIRECTORY>;
proxy_redirect off;
proxy_set_header Host $Host:<PORT_PROXY>;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
location = / {
return 301 https://$server_name/<SUBDIRECTORY>;
}
}
ありがとう!= D
Ssl vhostのこの動作からlocationサブディレクトリを除外しないと、明らかに機能しません。
server {
listen 80;
server_name example.com;
return 301 https://$server_name/subdirectory;
}
server {
listen 443 ssl spdy;
server_name example.com;
location /subdirectory {
# Your stuff
}
location = / {
return 301 https://$server_name/subdirectory;
}
}
server {
listen 80:
server_name example.com;
return 301 https://$server_name/subdirectory/;
}
server {
listen 443;
server_name example.com;
location = / {
return 301 https://$server_name/subdirectory/;
}
}
最後に末尾のスラッシュを追加した方法を参照してください。これは非常に重要です。そうしないと、リダイレクトループが発生します。