Re: location error, root не видит другие файлы

Maxim Dounin mdounin at mdounin.ru
Mon Oct 29 12:33:04 UTC 2012


Hello!

On Mon, Oct 29, 2012 at 08:05:15AM -0400, fura wrote:

> Всем привет.
> 
> Есть страничка, которая должна показываться при ошибки, в ней есть
> картинки(img src=), css и т.д.
> Вот пример конфига:
> 
> server_name  mysite;
> 
> error_page   404 502 /notwork.html;
> 
> location /notwork.html {
>     root   /var/www/notwork;
> }
> 
> location / {
>     proxy_pass      http://other_server:8080;
> }
> 
> 
> В файле notwork.html есть текст вида:
> <img ... src="mypics.png" ...>
> эта картинка (mypics.png) находится в директории /var/www/notwork, но не
> отображается.

Картинка не отображается, т.к. сама страница ошибки показывается 
по произвольному адресу, и попытавшись разрешить относительный 
путь от этого произвольного адреса - браузер гарантированно 
получит неправильный результат.

> Если же сделать :
> 
> error_page   404 502 /notwork;
> 
> location /notwork {
>     root   /var/www;
>     index notwork.html;
> }
> 
> то тогда все картинки и файлы отображаются, но когда сайт начинает работать,
> не уходит с этого урла на location / .

А так у вас в результате попытки возврата каталога будет 
перенаправление с кодом 301 на /notwork/.  Пути в рамках страницы 
ошибки при этом будут правильные, но исходный адрес страницы, где 
был пользователь, теряется.

(Кроме того, для того, чтобы добиться того же эффекта не нужны все 
эти сложности с индексным файлом и автоматическим 
перенаправлением, можно сразу адрес для перенаправления в 
error_page написать, но в любом случае редко когда нужно подобное 
поведение при обработке ошибок.)

> Как решить данную проблему?

Правильно делать так:

Определяем обработку ошибок:

   error_page 404 502 /errors/error.html;

Определяем обработку для страницы с ошибкой и файлов в ней:

   location /errors/ {
       root /var/www;
   }

Поскольку страница с ошибкой может показываться по совершенно 
разным с точки зрения браузера адресам, использование в ней 
относительных адресов для вставки картинок - недопустимо.  
Используем вместо этого полный путь от корня сайта:

   <img src="/errors/mypics.png"> 

Как-то так всё должно работать.

-- 
Maxim Dounin
http://nginx.com/support.html



Подробная информация о списке рассылки nginx-ru