Почему nginx обслуживает пользователь с именем .ico, но не favicon.ico?

#nginx

Вопрос:

Мой сервер Nginx отвечает , 404 когда клиент запрашивает a /favicon.ico , но все работает хорошо, если я переименую вещь как-нибудь иначе, например wip-icon.ico . Почему?

Конфигурация Nginx:

 server {
  listen 80;

  location / {
    root    /usr/share/nginx/html;
    index   index.html;
  }
}
 

Обслуживаемая страница (на которой я сменил "/favicon.ico" "/wip-icon.ico" ):

 <!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <link rel="icon" type="image/x-icon" href="/wip-icon.ico" />
    <title>Work in progress</title>
  </head>
  <body id="root">
    <script src="bundle.js"></script>
  </body>
</html>
 

Хост (где я раньше был favicon.ico вместо wip-icon.ico ):

 root@container:/usr/share/nginx/html# ls
50x.html  bundle.js  bundle.js.LICENSE.txt  index.html  wip-icon.ico
 

Проблема воспроизводима с помощью официального изображения Nginx Docker с использованием следующего сценария bash:

 function runInNewContainer {
  mkdir -p favicon-issue/www
  cd favicon-issue/www
  echo "<!doctype html><head><meta charset=utf-8><link rel="icon" type="image/x-icon" href="/$1" /></head>" > index.html
  touch $1
  echo 


Ответ №1:

Проблема заключалась в кэшировании. Использование curl -I <host>:<port>/favicon.ico ответил, 200 OK потому что curl не кэшируется.

FROM nginxnCOPY . /usr/share/nginx/html' > Dockerfile
docker build --tag $1 .
docker run --name $1 -d -p $2:80 $1
echo "Listening at port $2!"
rm $1
cd ../..
}
runInNewContainer 'favicon.ico' 8888
runInNewContainer 'custom.ico' 8889

Ответ №1:

Проблема заключалась в кэшировании. Использование curl -I <host>:<port>/favicon.ico ответил, 200 OK потому что curl не кэшируется.