Nginx - Serve static html content with whitespace in filename

Я использую эту настройку для обслуживания статических html файлов:

server {
    root /var/www/static_html;
    index index.html index.htm;

    location / {
        try_files $uri $uri/index.html $uri.html =404;
        autoindex on;
    }
}

Теперь если имя файла содержит пробелы "spam spam.html" ответ "404 Not Found"

В access.log:

"GET /spam%20spam.html HTTP/1.1" 404

Возможно ли обслуживать эти файлы?

0
задан 1 July 2017 в 05:41
1 ответ

Я столкнулся с той же проблемой при попытке настроить NGINX для обслуживания файлов WebP с тем же именем файла, что и JPG/PNG, и некоторые файлы содержали пространства. Причина, по которой это происходит, заключается в следующем:

  • пробел нельзя использовать внутри URL-адреса, и браузеры автоматически заменяют его внутри URL-адреса на %20, как вы, возможно, знаете
  • ]$uri в этом случае будет содержать ссылку с %20, как видно из логов
  • , когда NGINX ищет файл с %20 в его имя на диске, он его не найдет, потому что на диске он хранится с пробелом, а не с %20, поэтому это приведет к ошибке 404.

Потенциальный способ получить это работа заключается в замене %20 пробелом, и единственный способ добиться этого, который приходит мне на ум, — использовать что-то вроде модуля OpenRestly Lua NGINX:

https://github. com/openresty/lua-nginx-module​

Затем, после правильной установки и настройки (не очень просто!), вы можете попробовать что-то подобное непосредственно перед try_files:

access_by_lua_block {
        ngx.var.uri = string.gsub(ngx.var.uri, "%20", " ")
}

Это не на самом деле не проверено, это просто идея. Если есть лучшие способы добиться этого, я готов их проверить!

2
ответ дан 22 April 2021 в 12:50

Теги

Похожие вопросы