Nginx rewrite permanent или return 301 для www редиректа
Официльный сайт NGINX рекомендует return
Эти примеры добавляют или удаляют префикс www
:
# add 'www'
server {
listen 80;
listen 443 ssl;
server_name domain.com;
return 301 $scheme://www.domain.com$request_uri;
}
# remove 'www'
server {
listen 80;
listen 443 ssl;
server_name www.domain.com;
return 301 $scheme://domain.com$request_uri;
}
# NOT RECOMMENDED
rewrite ^(.*)$ $scheme://www.domain.com$1 permanent;
return
предпочтительнееrewrite
потому, чтоrewrite
требует интерпретации регулярного выражения —^(.*)$
— и создания пользовательской переменной ($1
) , что на самом деле эквивалентно встроенной переменной$request_uri
Однако надо быть внимательным. C return
можно поймать CRLF инекцию если в конфигурации будет конструкция вида
location / {
return 302 https://$host$uri;
}
Тогда при переходе по ссылке вида https://example.com/CRLF%0d%0aSet-Cookie:%20BUG%3dHi, злоумышленник может внедрить произвольный заголовок.
CRLF, или Carriage Return Line Feed, относится к тому типу уязвимостей, которые происходят, когда пользователь вставляет CRLF в приложение. Символы CRLF означают конец строки для множества интернет-протоколов, включая HTML, и выглядят как %0D%0A, что декодируется в rn. Они могут быть использованы для обозначения переноса строк и в сочетании с заголовками HTTP-запросов и ответов могут приводить к различным уязвимостям, включая HTTP Request Smuggling и HTTP Response Splitting