allow/deny and return
Gena Makhomed
gmm at csdoc.com
Wed Oct 16 13:59:55 UTC 2013
On 15.10.2013 19:57, Maxim Dounin wrote:
> Все директивы модуля rewrite - это в той или иной степени выбор
> конфигурации, даже если они unconditional. E.g., банальный set:
>
> set $file ".htpasswd";
> auth_basic_user_file /path/to/$file;
>
> так или иначе определяет конфигурацию, которая будет в дальнейшем
> использоваться для обработки запроса. Выполнять сначала
> access-проверки, и только потом директивы модуля rewrite - ни разу
> не вариант.
а если выполнять сначала только set (внутри location и внутри if)
потом access фазу и потом уже все остальные директивы модуля rewrite?
тогда и обратная совместимость с set не сломается и access-проверки
сработают всегда раньше, чем "опасные" директивы return и rewrite.
кстати, если добавить директиву handler, которая работает после фазы
try_files, то можно будет писать конфиг nginx без лишней избыточности:
location /admin {
satisfy any;
set $file ".htpasswd";
auth_basic_user_file /path/to/$file;
allow 10.1.1.1;
deny all;
handler @default;
}
location / {
handler @default;
}
location /for-test/ {
if ($arg_test=123) {
handler @special; # проблем не должно быть
}
handler @default;
}
location @default {
root ...;
try_files $uri $uri/ =404;
location ~ \.php$ {
root ...;
try_files $uri @virtual;
fastcgi_pass ...;
fastcgi_param SCRIPT_FILENAME /path/to$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param QUERY_STRING $args;
}
}
location @virtual {
fastcgi_pass ...;
fastcgi_param SCRIPT_FILENAME /path/to/index.php;
fastcgi_param SCRIPT_NAME /index.php;
fastcgi_param QUERY_STRING q=$uri&$args;
}
>>>> по крайней мере, в UNIX и даже в WINDOWS все работает именно так:
>>>> если доступа к файлу нет, никаких операций с ним сделать нельзя.
>>
>>> В Антоном конфиге нет файла. Есть инструкция "при выборе
>>> конфигурации для обработки запросов вернуть ответ с кодом 200".
>>
>> файла нет. но есть location /closed и есть директивы задания доступа
>> кому allow, а кому deny. то что return срабатывает раньше deny - это
>> будет совершенно неожиданно для более чем 99% пользователей nginx...
>
> С якобы багом разобрались - отлично. Возвращаемся к исходному
> разговору - если есть идеи, как _хорошо_ объяснить пользователям,
> почему так - you are welcome.
почему return/rewrite работает раньше access - я смог нормально понять
только после того, как прочитал http://www.aosabook.org/en/nginx.html
начиная со слов "Which brings us to the phases." причем, вот этой:
...the request goes through six phases:
1. server rewrite phase
2. location phase
3. location rewrite phase (which can bring the request back to the
previous phase)
4. access control phase
5. try_files phase
6. log phase
очень важной информации нет в официальной документации.
кстати, если пользователи столкнутся с ситуацией, что access-обработчики
не работают в location где используется return и rewrite -
они в первую очередь буду искать причину в документации
к соответствующим access модулям, а не в модуле rewrite
> Аналогичный конфиг, кстати, рассматривается в подробностях тут:
>
> http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#internals
весь остальной псевдокод после "match of regular expression" разве
не должен быть с отступом в 4 пробела, таким же как и у "return 403" ?
--
Best regards,
Gena
Подробная информация о списке рассылки nginx-ru