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