Странное поведение Nginx с косыми чертами - PullRequest
0 голосов
/ 06 ноября 2018

У меня довольно интересное поведение. Я хочу избежать косой черты в URL на моем сайте. Я положил rewrite ^/(.*)/$ /$1 permanent; правило в свой блок сервера, поэтому
https://example.com/something/
https://example.com/something////
перенаправить на
https://example.com/something;
и
https://example.com/
перенаправляет на
https://example.com

Но https://example.com//// перенаправляется на ... https://enjoygifts.ru//// (на самом деле не перенаправлено, это 200 код). Почему?

Вот мой блок сервера:


    server {
        listen 443 ssl;
        ...
        ... ssl directives
        ...

        root        /var/www/mysite.com;
        index       index.php;
        server_name mysite.com;
        rewrite ^/(.*)/$ /$1 permanent;

        location / {
            rewrite ^/.*$ /index.php last;
        }

        location ~ ^/index.php {
            try_files    $uri =404;
            include      /etc/nginx/fastcgi.conf;
            fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        }

        location ~ ^/storage/app/uploads/public { try_files $uri 404; }
        ...
        ... lot of similar location blocks
        ...
    }

1 Ответ

0 голосов
/ 06 ноября 2018

https://example.com на самом деле не существует, корневой URI - / - способ его отображения в адресной строке браузера зависит от браузера - некоторые автоматически отображают одиночный /, тогда как другие удаляют одиночный / .

Таким образом, вы не можете перенаправить с https://example.com/ на https://example.com - он будет молча интерпретироваться как перенаправление с https://example.com/ на https://example.com/.

Nginx использует нормализованный URI при оценке операторов location и rewrite и генерации переменной $uri. Несколько последовательных вхождений / складываются в один /.

Хотя регулярное выражение ^/(.*)/$ соответствует URI //, оператор никогда его не увидит. Потому что Nginx уже нормализовал этот URI до /, что не соответствует регулярному выражению.


Если возникает проблема с корневым URI с несколькими / s, примените регулярное выражение к переменной $request_uri, которая содержит исходный URI перед нормализацией, а также строку запроса (если есть).

Например:

if ($request_uri ~ "^/{2,}(\?|$)") { 
    return 301 /$is_args$args; 
}

Это может быть размещено внутри вашего блока location / {...}. См. это предупреждение по использованию if.

...