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

Похожие записи