Полезные редиректы в nginx. Примеры редиректов в NGINX

1. Nginx, 301 редирект с http на https протокол

Если у вас на сайте есть SSL сертификат для домена, то вы можете настроить https протокол. После чего для 301-го редиректа вам необходимо добавить следующий код в файл конфигурации nginx для домена:

Server { #... if ($scheme = http) { return 301 https://$server_name$request_uri; } }

Server { #... listen server_ip:80; server_name www.devreadwrite.com; rewrite ^ https://www.devreadwrite.com$request_uri? permanent; }

2. Nginx, 301 редирект с https на http протокол

Обратный пример конфигурации для редиректа с http на https:

Server { listen 443; server_name www.devreadwrite.com; rewrite ^ http://www.devreadwrite.com$request_uri? permanent; } server { listen 80; server_name www.devreadwrite.com; #... }

3. Nginx, 301 редирект с www на без www

Пример 301-го редиректа на основное зеркало без www:

Server { #... if ($host ~* www\.(.*)) { set $host_without_www $1; rewrite ^(.*)$ http://$host_without_www$1 permanent; } }

Server { #... server_name www.devreadwrite.com; rewrite ^/(.*)$ http://devreadwrite.com/$1 permanent; }

4. Nginx, 301 редирект с без www на с www

Обратный пример 301-го редиректа на основное зеркало сайта с www:

Server { #... server_name devreadwrite.com; rewrite ^/(.*)$ http://www.devreadvrite.com/$1 permanent; } server { listen 80; server_name www.devreadvrite.com; #... }

5. Nginx, 301 редирект для одной страницы

Если у страницы поменялся URL, то лучше сделать 301 редирект на новый URL:

Server { #... if ($request_filename ~ oldpage/) { rewrite ^ http://www.devreadvrite.com/newpage/? permanent; } #... }

6. Nginx, 301 редирект для папки

Аналогичный пример 301-го редиректа для папки:

Server { #... if ($request_filename ~ oldfolder/.+) { rewrite ^(.*) http://www.devreadvrite.com/newfolder/$1 permanent; } #... }

7. Nginx, 301 редирект с одного домена на другой

Если вы сменили домен сайт и хотите перенести вес старого домена на новый, то можно сделать 301-й редирект со старого домена на новый:

Server { server_name domain.com www.devreadvrite.com; rewrite ^ $scheme://www.new-devreadvrite.com; }

8. Nginx, 301 редирект с каждой страницы одного домена на такой же URL адрес другого домена Если вы планируете изменить свой домен или изменить название предприятия, то перенаправление домена является единственным лучшим решением для сохранения пользователей и перевода их запросов на новый домен.

Server { server_name devreadvrite.com www.devreadvrite.com; rewrite ^ $scheme://www.new-devreadvrite.com$request_uri permanent; }

9. Nginx, 301 редирект со страниц со слешем на страницы без слеша в конце URL

Часто бывает так что одна и та же страница доступна по двум URL, например /may-best-page и /my-best-page/, если человеку понятно что это одна и та же страница, то поисковые системы понимают это как две разные страницы, соответственно разбивают вес страницы, а также показываются в аналитике (статистике) как 2 разные страницы. Для того, что бы избежать этого вы можете сделать 301 редирект со страниц со слешем в конце URL на без него:

Server { #... rewrite ^/(.*)/$ /$1 permanent; #... }

10. Nginx, 301 редирект со страниц без слеша на страницы со слешем в конце URL

Причина делать такой редирект та же, что и в ситуации описанным выше, за исключением того, что редирект необходимо делать со страницы без слеша в конце URL на страницу со слешем в конце URL:

Server { #... rewrite ^(.*[^/])$ $1/ permanent; #... }

Дополнительно:

Не забудьте перед использованием примеров сменить devreadwrite.com на свой домен. После внесения изменений в файл конфигурации nginx для домена необходимо перезапустить nginx:

Service nginx reload

Nginx is an extremely efficient and quite flexible web server. When you want to do a redirect in Nginx, you have a few options to select from, so you can choose the one that suits you best to do an Nginx redirect.

Simplest and fastest: return

The by far simplest and fastest – because there is no regexp that has to be evaluated – is to use the return statement. Place this in your server block:

Return 301 https://example.com$request_uri;

This is a permanent redirect. Use 302 if you want a temporary redirect. A full sample server block could be:

Server { listen 80; listen [::]:80; hostname example.com www.example.com; return 301 https://example.com$request_uri; }

Using regular expressions

If you need something more complex, don’t be afraid to use a regexp – they’re still extremely fast in Nginx:

Rewrite ^/foo/(bar)/(.*)$ https://$server_name/$1/$2 permanent;

Replace permanent with redirect if you want a temporary (HTTP 302) redirect. Our full sample server block could then be:

Server { listen 80; listen [::]:80; hostname example.com www.example.com; root /var/www/example.com/public; rewrite ^/foo/(bar)/(.*)$ $scheme://$server_name/$1/$2 permanent; }

Using maps

If you have a list of URLs or regular expressions that you want to redirect differently, you ought to look into using a map, which you very well may define in a separate file for your convenience. Just note that the map definition must be outside the server block:

Include redirect-map.conf; server { […] if ($redirect_uri) { return 301 $redirect_uri; } }

The file redirect-map.conf may then look something like this:

Map $request_uri $redirect_uri { /about.html /about-us; /customers.html /our-customers; /products.html /our-products; }

Note the following excerpt from the docs:

A regular expression should either start from the “~” symbol for a case-sensitive matching, or from the “~*” symbols (1.0.4) for case-insensitive matching. A regular expression can contain named and positional captures that can later be used in other directives along with the resulting variable.

Here’s an example that might help you understand what that was about:

Map $request_uri $redirect_uri { /about.html /about-us; /customers.html /our-customers; /products.html /our-products; # Match any url that ends in products.html or producs.htm ~products\.html?$ /our-products; # case-insensitive version of the above ~*products\.html?$ /our-products; # A named capture that maps # e.g. product-1234.html into /products/item-1234/overview ~product-(?\d+)\.html /products/item-$sku/overview; }

Cute, huh? :-) Also please note that the variable name $redirect_uri have no special meaning: It is one I made up. You can name it whatever you like, but make sure the variable name in the map and the server block matches.

Some useful variables

I’ve used a few of these in the examples above, so you might have noticed them before. These are variables that comes predefined by Nginx, ready for you to use in your configs:
$scheme – The scheme used for the current request. E.g. “http” or “https”
$host – The hostname provided by the client for the current request.
$server_name – The first hostname from the hostname declaration in your config for the server block that responds to the request.
$request_uri – The full original request URI – with arguments.
$request_filename – The file path for the current request.

Some useful recipes for an Nginx redirect

HTTP to HTTPS

return 301 https://$host$request_uri;

Canonical hostname

If the hostname doesn’t match the first name in the server_name list. Makes sure your content is only available at the canonical hostname, e.g. to avoid duplicate content issues. Excellent for redirecting non-www to www or redirecting www to non-www in Nginx as long as your server block is only for a single website.

Server_name example.com www.example.com example.net www.example.net _; if ($host != $server_name) { return 301 $scheme://$server_name$request_uri; }

Nginx is very efficient, but please note that it would be more efficient to have two separate server blocks – one for the hostnames you want to redirect and one for the website. Then Nginx won’t have to do the comparison for every request.

Generic non-www/www redirects

If your server block covers multiple websites – e.g. a WordPress multisite network and you don’t want all of them to redirect to the same hostname, you can still do a universal check:

Redirect non-www to www:

if ($host !~ ^www\.) { return 301 $scheme://www.$host$request_uri; }

Redirect www to non-www

if ($host ~ ^www\.(?.+)$) { return 301 $scheme://$domain$request_uri; }

For the www/non-www redirects, it is worth mentioning again that using separate server blocks, where one use the return statement described at the top, is by far the most efficient.

Как и большая часть сайтов интернета, которые следуют современным тенденциям сайт использует безопасный протокол связи https. Многим сайтам при переходе на https необходимо, чтобы весь трафик, который приходит на порт http автоматически перенаправлялся на https.

Это необходимо из соображений SEO оптимизации, а также безопасности пользователей, чтобы никто не мог разорвать защищенное соединение. В этой статье мы рассмотрим как настроить редирект с http на https Nginx.

Редирект с http на https Nginx

Я предполагаю, что вы будете использовать постоянное перенаправление с кодом статуса 301. Это означает перемещение на постоянной основе. Такой метод используется чтобы сообщить поисковым системам или браузеру, что текущая ссылка была обновлена, и ее стоит обновить в своей базе, например, закладок браузера.

В конфигурационном файле Nginx должно быть две секции server, для сайта на https и сайта http. В секции http вы просто перенаправляете все запросы на https c помощью инструкции return, а во второй секции уже все обрабатываете. Например, первая секция:

server {
server_name сайт www.сайт;
charset off;
index index.php;
ssi on;
return 301 https://$host:443$request_uri;

root $root_path;
listen:80 default_server;
...
}

Вторая секция уже с обработкой SSL слушает запросы на 443 порту:

server {
server_name сайт www.сайт;
ssl on;
ssl_certificate "/var/www/losst/сайт_le2.crtca";
ssl_certificate_key "/var/www/losst/сайт_le2.key";
ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
add_header Strict-Transport-Security "max-age=31536000;";
charset off;
index index.php;
set $root_path /var/www/losst/data/www/сайт;
root $root_path;
listen:443 default_server;
...
}

Собственно, синтаксис тут очень прост, инструкция return позволяет возвращать необходимые коды ответа сервера. Здесь же мы возвращаем код 301, постоянный редирект, а также URL, на который собираемся перенаправить пользователя. Кроме директивы return, можно использовать инструкцию rewrite, с помощью нее выполняются точно те же действия:

rewrite ^/(.*)$ https://losst.com/$1 permanent;

Это обычный синтаксис регулярных выражений. В первом аргументе мы выделяем группу строки запроса, а во второй указываем правильный домен. Ее можно добавить вместо return 301. Также можно использовать такую конструкцию без отдельного блока server:

if ($host ~* ^(losst\.ru|www\.losst\.ru)$){
rewrite ^/(.*)$ https://сайт/$1 permanent;
}

Теперь осталось протестировать то, что получилось. Сохраните файл и проверьте конфигурацию nginx:

Затем, если все хорошо, перезапустите Nginx:

curl -I сайт

Или позволим утилите проследовать полный путь по перенаправлению:

curl ILa сайт

Выводы

Настроить редирект на https nginx достаточно просто, фактически, все выполняется добавлением одной строки в конфигурационный файл, все остальное - дополнительные параметры. Редирект с https на http nginx будет выполняться так же. Только нужно будет изменить несколько букв в параметрах retrun. Не забывайте проверять правильно ли настроены редиректы с www и на https, это играет очень важную роль для SEO. Надеюсь, эта информация была полезной для вас.