Nginx удалить WWW и ответить на оба
У меня есть следующий фрагмент конфигурации nginx:
server {
listen 80;
server_name mydomain.io;
root /srv/www/domains/mydomain.io;
index index.html index.php;
access_log /var/log/nginx/domains/mydomain.io/access.log;
error_log /var/log/nginx/domains/mydomain.io/error.log;
location ~\.php {
try_files $uri =404;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_intercept_errors on;
fastcgi_pass 127.0.0.1:9000;
include /etc/nginx/fastcgi_params;
}
}
Во-первых, как я могу заставить серверный блок ответить на both
http://www.mydomain.io, а также http://mydomain.io. Во-вторых, я хочу заставить, если они пришли из http://www.mydomain.io, чтобы перенаправить на http://mydomain.io.
Спасибо.
Ответы
Ответ 1
По первому вопросу - просто добавьте оба домена:
server_name mydomain.io www.mydomain.io;
Для второго вам понадобится эта простая переадресация:
server {
listen 80;
server_name www.mydomain.io mydomain.io;
if ($host = 'www.mydomain.io' ) {
rewrite ^/(.*)$ http://mydomain.io/$1 permanent;
}
Ответ 2
Согласно https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#server-name-if, вы должны использовать:
server {
server_name www.example.com;
return 301 $scheme://example.com$request_uri;
}
server {
server_name example.com;
# [...]
}
Ответ 3
Я считаю, что лучше добавить два отдельных серверных блока, чтобы избежать ненужной проверки блоком if
. Я также использую переменную $schem, так что запросы HTTPS не будут перенаправлены на их небезопасные копии.
server {
listen 80;
server_name www.mydomain.io;
rewrite ^ $scheme://mydomain.io$uri permanent;
}
server {
listen 80;
server_name mydomain.io;
# your normal server block definitions here
}
Ответ 4
Другой способ его кодирования:
if ($http_host ~* "^www\.(.+)$"){
rewrite ^(.*)$ http://%1$request_uri redirect;
}
Он работает даже с несколькими доменными именами одного и того же кода.
Ответ 5
Для общего подхода, не говоря уже о каком-либо конкретном домене или протоколе, я использовал это довольно успешно:
# rewrite to remove www.
if ( $host ~ ^www\.(.+)$ ) {
set $without_www $1;
rewrite ^ $scheme://$without_www$uri permanent;
}
Это будет перенаправлено: https://www.api.example.com/person/123?q=45
to https://api.example.com/person/123?q=45
Ответ 6
server {
listen 80;
server_name www.mydomain.io;
return 301 https://$host$request_uri;
}
server {
listen 80;
server_name mydomain.io;
...
}