Назад | Перейти на главную страницу

Перенаправить на 404, если имя файла, переданное как параметр, не существует

У меня есть специальный параметр 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;
  }

}