Как исправить http-перенаправления с помощью Nginx?
У меня есть веб-страница, где http-перенаправления немного нарушены.
текущее поведение таково:
www.example.com, example.com,http://www.example.com, http://example.com, https://www.example.com все перенаправляется на https://www.example.com
и
https://example.com получает сообщение об ошибке отказано в подключении.
Я хочу, чтобы поведение быть таким:
example.com,http://example.com, https://example.com перенаправляет на https://example.com
www.example.com,http://www.example.com, https://www.example.com перенаправляет на https://www.example.com
вот мой конфигурационный файл Nginx
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}
server {
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
include snippets/ssl-example.com.conf;
include snippets/ssl-params.conf;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location ~ /.well-known {
allow all;
}
location / {
try_files $uri $uri/ =404;
}
}
причина в том, что я хочу, чтобы эти ссылки работа
https://www.ssllabs.com/ssltest/analyze.html?d=example.com
https://www.ssllabs.com/ssltest/analyze.html?d=www.example.com
2 ответов
у вас есть два независимых вопроса:
- все ваши запросы перенаправляются на
example.com
, независимо от того, какой конкретный домен изначально обращались.
это происходит потому, что $server_name
переменная, которую вы используете, фактически является статической переменной в данном server
контексте, и имеет очень отдаленное отношение к $http_host
.
правильным способом было бы использовать $host
вместо этого (что в основном $http_host
С некоторыми очистками edge-corner).
- вы получаете проблемы с подключением при попытке связаться
https://example.com
, но неhttps://www.example.com
.
в вашем вопросе недостаточно информации, чтобы точно определить происхождение этой проблемы.
это может быть проблема DNS (A
/AAAA
отчеты example.com
установить на IP-адрес, где соответствующие привязки к https
порт не производится).
это может быть проблема с несоответствием сертификата:
Ваш сертификат охватывает оба
example.com
иwww.example.com
? Если нет, то вы не можете иметь и то, и другое.если у вас есть отдельные сертификаты, вам также может потребоваться приобрести отдельные IP-адреса или риск предотвращения доступа значительного числа пользователей к вашему сайту из-за отсутствия SNI.
как Примечание, следует также отметить, что это, как правило, небрежная практика, чтобы не иметь единой нотации на пути доступа к вашему сайту. Особенно, если SEO имеет какое-либо отношение к вам, лучшая практика-решить, хотите ли вы пойти с или без www
, и придерживайтесь его.
вам нужно что-то вроде этого:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
server_name www.example.com;
include snippets/ssl-example.com.conf;
include snippets/ssl-params.conf;
add_header Strict-Transport-Security "max-age=300; includeSubdomains; preload";
return 301 https://www.example.com$request_uri;
}
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
server_name example.com;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
include snippets/ssl-example.com.conf;
include snippets/ssl-params.conf;
add_header Strict-Transport-Security "max-age=300; includeSubdomains; preload";
location ~ /.well-known {
allow all;
}
location / {
try_files $uri $uri/ =404;
}
}
все ваши запросы будут в конечном итоге направлены на https://example.com. Ваш SSL-сертификат также должен быть действителен дляhttps://www.example.com что, как я заметил, Вы сказали.