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

Как мне обработать отсутствующий файл RewriteMap?

Я определяю RewriteMap в моей конфигурации Apache httpd. (Это работает правильно.)

RewriteMap redirects-list txt:/path/to/redirects.txt

Но когда файл карты (/path/to/redirects.txt) не существует, сервер выдает ошибку:

RewriteMap: файл для списка перенаправлений карты не найден: /path/to/redirects.txt

Хочу сделать этот отказоустойчивым там, где RewriteMap устанавливается тогда и только тогда, когда файл существует.

(Например, если его не существует, возможно, есть способ автоматически использовать резерв, пустой файл, например /dev/null.)

Буду признателен за любую помощь.

Кажется, нет способа установить RewriteMap условно. Я попытался установить RewriteMap в <If> директива с использованием выражения Apache для проверки существования файла. Например:

<If "-f '/path/to/redirects.txt'">
    RewriteMap redirects-list txt:/path/to/redirects.txt
</If>

Однако это синтаксически неверно, и сервер не сможет запуститься из-за ошибки:

RewriteMap здесь запрещен

Как уже говорилось, вы должны протестировать конфигурацию перед (повторным) запуском сервера Apache.


Стоит отметить, что если есть зависимые директивы, которые используют это (не существует) RewriteMap тогда они просто потерпят неудачу. (Даже с LogLevel rewrite:trace6 похоже, что в этом отношении не зарегистрировано ничего значимого?). Таким образом, если сервер не запускается, когда файл карты не существует, может показаться лучшим вариантом (даже если удалить файл карты потом не приводит к "ошибке").

Используйте настоящий пустой файл или файл с комментариями. Apache распознает изменения в файле без перезагрузки / перезапуска.

https://httpd.apache.org/docs/2.4/rewrite/rewritemap.html#txt

Кешированные поиски

Найденные ключи кэшируются httpd до тех пор, пока не изменится mtime (время изменения) файла карты или пока сервер httpd не будет перезапущен. Это обеспечивает лучшую производительность на картах, вызываемых множеством запросов.

Отсутствующий файл RewriteMap является ошибкой (apachectl configtest) и /dev/null как файл работает, но это плохой стиль. В этом случае было бы лучше прокомментировать эти строки в вашем config.