У меня есть специальный параметр data=/path/to/filename.htm
в uri.
Его старый и ржавый сайт построен на SSI, и я не могу его изменить.
Проблема в том, что когда имя файла, переданное как arg_data, не существует, страница не работает.
В этом случае я хочу перенаправить на 404.htm.
Что-то такое:
if (!-f $arg_data){
rewrite ^.*$ /404.htm last;
}
Но я получаю:
перезапись или внутренний цикл перенаправления при обработке "/404.htm
Я думаю, это потому, что я не проверял if arg_data
существуют.
Но в nginx нет вложенных if-ов.
Я попытался:
set $data index.htm;
if ($args ~ "data=(.+)") {
set $data $1;
}
if (!-f $data) {
rewrite ^.*$ /404.htm last;
}
Идея была установлена $data
в какой-то файл, который существует на 100%, и после этого перепишите, если передан параметр данных.
По какой-то причине он дает ту же ошибку, цикл внутреннего перенаправления
Похоже, я делаю это неправильно.
Хорошо, это очень странный сценарий, и, похоже, вы на правильном пути.
Вместо rewrite
хотя я бы return 404;
и использовать error_page
для определения страницы ошибки 404.
Например:
server {
#...your other stuff...
error_page 404 /404.htm;
if (!-f $arg_data){
return 404;
}
}
Итак, что касается наших последних комментариев, вам понадобится AND
условие для двоих if
заявления.
NGinx
не может этого сделать.
Чтобы добиться этого, мы воспользуемся небольшим трюком с $test
var:
server {
#...directives...
error_page 404 /404.htm;
if ($args != "") { # Test if there are some args
set $test A;
}
if (!-f /full/path/to/$arg_data) { # Test if file in args doesn't exist
set $test "${test}B";
}
if ($test = AB) { # If there are some args AND if file doesn't exist
return 404;
}
}