index internal redirect

Gena Makhomed gmm на csdoc.com
Сб Июн 18 00:23:18 MSD 2011


On 16.06.2011 21:59, Igor Sysoev wrote:

>>> Сейчас при нахождении индексного файла делается внутрений редирект.
>>> Это позволяет работать конфигурациям типа
>>>
>>> location / {
>>>      index  index.php;
>>> }
>>>
>>> location ~ \.php$ {
>>>      ...
>>> }
>>>
>>> Но иногда нужно, чтобы обработка проиходила без редиректа,

кроме случая "запрещения явного запроса /index.html", какие еще
могут быть причины для обработки без редиректа, если не секрет ?

>>> например, для запрещения явного запроса /index.html,
>>> хотя это можно решить так:
>>>
>>> location = / {
>>>      index  index.html;
>>> }
>>>
>>> location = /index.html {
>>>      internal;
>>> }

немножко другой случай, у сайта стоит index index.php;
и администратор хочет запретить явный запрос к /index.php

если будет "обработка индексного файла без внутреннего редиректа" -
то в этом случае в ответ на запрос клиента будет отдан php-исходник

а ведь сайтов с динамическими индексными страницами index.php
больше в современном интернете, чем со статическими index.html

если "обработка индекского файла без внутреннего редиректа" нужна
только "иногда", может быть для этого случая хватит и существующего
уже сейчас функционала location = / { try_files /index.html =404; } ?

> Возможно, имеет можно что-то придумать со звёздочками, скобочками
> и тому подобному.

таким образом сейчас синтаксис конфигурационного файла nginx
начинает плавно дрейфовать в сторону апачевского mod_rewrite ?
а вот что было год назад: http://www.lexa.ru/nginx-ru/msg34942.html

> Например, сейчас try_files поддерживает слэш
> в конце параметра, обозначающий тестирование каталога, и знак равно
> для обозначения кода ошибки для fallback'а:
>
>     try_files  $uri  $uri/  =404;
>
> Для try_files хотелось бы придумать ещё два модификатора - делать
> внутренний редирект при нахождении файла (как сейчас делается для index)
> и проверка абсолютного пути (а не относительно root/alias).
> Например, абсолютный путь - два начальных слэша:
>
>     try_files  //path/to/maintenance.html  $uri  $uri/  @php;

если планируется когда-то делать полноценную версию nginx для windows,
то синтаксис //path/to/maintenance.html для указания абсолютного имени
файла не очень хорош: //"C:\\Documents and settings\\path\\to\\file"

может быть такой вариант, с помощью префикса "absolute_path::" ?

try_files absolute_path::/path/to/maintenance.html $uri  $uri/  @php;

ведь такая возможность будет нужна очень редко, и кроме того,
такой синтаксис - // - является потенциально очень опасным,
например, если кто-то вместо /etc/passwd; случайно ошибется
и наберет в конфиге //etc/passwd; - тогда путь из относительного 
превратится в абсолютный. что-то аналогичное есть в C с '=' и '=='.

аналогично и с внутренним редиректом:

try_files internal_redirect::/system/maintenance.html $uri  $uri/  @php;

и, комбинация этих двух параметров в произвольном порядке:

try_files absolute_path::internal_redirect::/system/maintenance.html

или

try_files internal_redirect::absolute_path::/system/maintenance.html

по крайней мере, этот вариант расширения синтаксиса try_files находится
достаточно далеко от синтаксиса апачевского mod_rewrite и sendmail.cf.

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

если надо иметь возможность указывать какие-то дополнительные параметры
для этих модификаторов, тогда можно в дальнейшем расширить синтаксис еще
дальше:

internal_redirect( дополнительные параметры )::/system/maintenance.html

или

internal_redirect{ дополнительные параметры }::/system/maintenance.html

-- 
Best regards,
  Gena




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