https://example.com を https://www.example.com にリダイレクトしようとするとエラーが発生します。
https://example.com にアクセスすると、リダイレクトされず、page/200ステータスが返されます。
これは必要ありません。リダイレクトするには https://www.example.com を使用します。
http://example.com にアクセスすると、 https://www.example.com にリダイレクトされます
誰かが私がどこで間違っているのか教えてもらえますか?
これは私のデフォルトおよびdefault-ssl構成ファイルです。
default.conf
server {
listen 80;
server_name example.com;
return 301 https://www.example.com$request_uri;
}
default-ssl.conf
upstream app_server_ssl {
server unix:/tmp/Unicorn.sock fail_timeout=0;
}
server {
server_name example.com;
return 301 https://www.example.com$request_uri
}
server {
server_name www.example.com;
listen 443;
root /home/app/myproject/current/public;
index index.html index.htm;
error_log /srv/www/example.com/logs/error.log info;
access_log /srv/www/example.com/logs/access.log combined;
ssl on;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_certificate /srv/www/example.com/keys/ssl.crt;
ssl_certificate_key /srv/www/example.com/keys/www.example.com.key;
ssl_ciphers AES128-SHA:RC4-MD5:ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:RSA+3DES:!ADH:!AECDH:!MD5:AES128-SHA;
ssl_prefer_server_ciphers on;
client_max_body_size 20M;
try_files $uri/index.html $uri.html $uri @app;
# CVE-2013-2028 http://mailman.nginx.org/pipermail/nginx-announce/2013/000112.html
if ($http_transfer_encoding ~* chunked) {
return 444;
}
location @app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_Host;
proxy_redirect off;
proxy_pass http://app_server_ssl;
}
error_page 500 502 503 504 /500.html;
location = /500.html {
root /home/app/example/current/public;
}
}
ファイルdefault-ssl.conf
にlisten
ディレクティブがありません。このディレクティブにlisten 443;
を追加します
server {
server_name example.com;
return 301 https://www.example.com$request_uri;
}
デフォルトでは、このディレクティブを省略した場合、nginxはポート80でリッスンすることを前提としています。 ここではドキュメント このデフォルトの動作。
編集:@TeroKilkanenからのコメントをありがとう。
ここにdefault-ssl.confの完全な設定があります
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /srv/www/example.com/keys/ssl.crt;
ssl_certificate_key /srv/www/example.com/keys/www.example.com.key;
return 301 https://www.example.com$request_uri;
}
Sidenote: nginxドキュメント の推奨事項として、ssl on;
ディレクティブをlisten 443 ssl;
に置き換えることができます。
Ifステートメントをスローするだけで、すぐに行くことができます。 curl.exe -Iで結果をチェックしました https://www.example.com 以外のすべてのケースは301として扱われます。301URLリダイレクトを取得する前にチェックされるため、SSLはトリッキーです。したがって、証明書エラーが発生します。
個人的には、ドメインからwwwを削除するのが好きですが、質問に答えるために以下のコードを書きました。
server {
listen 443 ssl;
listen [::]:443 ssl; # IPV6
server_name example.com www.example.com; # List all variations here
# If the domain is https://example.com, lets fix it!
if ($Host = 'example.com') {
return 301 https://www.example.com$request_uri;
}
# If the domain is https://www.example.com, it's OK! No changes necessary!
... # SSL .pem stuff
...
}
server {
listen 80;
listen [::]:80;
# If the domain is http://example.com or https://www.example.com, let's change it to https!
server_name example.com www.example.com;
return 310 https://www.example.com$request_uri;
}
私のやり方は、wwwのhttpsにリダイレクトするsslサーバーブロック内のifステートメントを使用することです
ssl_certificate /srv/www/example.com/keys/ssl.crt;
ssl_certificate_key /srv/www/example.com/keys/www.example.com.key;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers AES128-SHA:RC4-MD5:ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:RSA+3DES:!ADH:!AECDH:!MD5:AES128-SHA;
ssl_prefer_server_ciphers on;
client_max_body_size 20M;
upstream app_server_ssl {
server unix:/tmp/Unicorn.sock fail_timeout=0;
}
server {
server_name example.com;
return 301 https://www.example.com$request_uri
}
server {
listen 443 default_server ssl;
server_name www.example.com;
# redirect https://example.com to https://www.example.com
# mainly for SEO purposes etc
#we will use a variable to do that
set $redirect_var 0;
if ($Host = 'example.com') {
set $redirect_var 1;
}
if ($Host = 'www.example.com') {
set $redirect_var 1;
}
if ($redirect_var = 1) {
return 301 https://www.example.com$request_uri;
}
try_files $uri/index.html $uri.html $uri @app;
# CVE-2013-2028 http://mailman.nginx.org/pipermail/nginx-announce/2013/000112.html
if ($http_transfer_encoding ~* chunked) {
return 444;
}
location @app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_Host;
proxy_redirect off;
proxy_pass http://app_server_ssl;
}
error_page 500 502 503 504 /500.html;
location = /500.html {
root /home/app/example/current/public;
}
}
もちろん、nginx構成ファイルでifステートメントを使用したいときはいつでも、あなたは読んだはずです: https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/
2018年の今、私は、誰かが簡単な解決策を探している場合に備えて、このショットを更新することを考えました。
私がこれを比較的新参者として捉えているのは、物事をできるだけ単純にすることです。基本的に http://example.com と https://example.com の両方をhttpsにリダイレクトします: //www.example.com。そして、あなたはリダイレクトに成功するだけ http://example.com
これは2つのサーバーブロックのみを必要とする非常に単純な操作です(これを単一の構成ファイルで簡単に説明します)。
# 1. Server block to redirect all non-www and/or non-https to https://www
server {
# listen to the standard http port 80
listen 80;
# Now, since you want to route https://example.com to http://www.example.com....
# you need to get this block to listen on https port 443 as well
# alternative to defining 'ssl on' is to put it with listen 443
listen 443 ssl;
# define server_name
server_name example.com *.example.com;
# DO NOT (!) forget your ssl certificate and key
ssl_certificate PATH_TO_YOUR_CRT_FILE;
ssl_certificate_key PATH_TO_YOUR_KEY_FILE;
# permanent redirect
return 301 https://www.example.com$request_uri;
# hard coded example.com for legibility
}
# end of server block 1. nearly there....
# 2. Server block for the www (primary) domain
# note that this is the block that will ultimately deliver content
server {
# define your server name
server_name www.example.com;
# this block only cares about https port 443
listen 443 ssl;
# DO NOT (!) forget your ssl certificate and key
ssl_certificate PATH_TO_YOUR_CRT_FILE;
ssl_certificate_key PATH_TO_YOUR_KEY_FILE;
# define your logging .. access , error , and the usual
# and of course define your config that actually points to your service
# i.e. location / { include proxy_params; proxy_pass PATH_TO_SOME_SOCKET; }
}
# End of block 2.
# voilà!
http://example.com と https://example.com の両方が https://www.example.com にリダイレクトされます。基本的に、この設定では、www以外および/またはhttps以外のすべてを https:// www にリダイレクトします。
私の場合、 http://example.com から https://www.example.com にリダイレクトします。私はnginxをこのような "IF条件"で構成し、それは私のために動作します。
server {
listen 80;
server_name example.com;
if ($Host = example.com) {
return 301 https://www.$Host$request_uri;
}
location / {
root html;
index index.php index.html index.htm;
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $Host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
....
server {
server_name www.example.com;
listen 80;
return 404;
}