NginX: использование xxx.php в качестве резервного варианта для отсутствующих файлов xxx.html в нескольких местах

Вопрос или проблема

Я был небрежным в написании некоторых внешних приложений и ссылок в прошлом, где использовал “name.html” в URL на мой веб-сервер, только чтобы позже изменить эти страницы на использование расширений .php, а затем ссылаться на них из других мест.

Поэтому, используя Apache, я добавил множество правил перезаписи в файл .htaccess так:

RewriteRule ^page\.html?$ page.php [NC]

Теперь я рассматриваю возможность перехода на NginX. Я увидел директиву try_files и задумался, могу ли я использовать её централизованно, то есть всегда использовать .php расширение, если запрашиваемый .html файл недоступен. Но кажется, это невозможно, так как я не могу связать это с правилами регулярных выражений / замены, верно?

Какие другие варианты у меня есть? Думаю, я могу, как в Apache, добавить множество директив перезаписи в основной .conf файл сервера для каждого местоположения, вот так:

location /directoryname/ {
    rewrite ^(.*)/page\.html$ $1/page.php break;

Или есть более простой способ?

Вы можете использовать try_files для вашей задачи.

Используйте location с поддержкой регулярных выражений, это позволит вам определить переменную с местоположением файла, убрав расширение .html.

Если у вас неправильно определен content-type и страница скачивается, добавьте директиву default_type.

location ~ ^(?<filename>.+)\.html$ {
    try_files $filename.html $filename.php;
    default_type text/html;
}

Вам также нужна конфигурация для обработки .php файлов, которая зависит от ваших настроек. Например, простой PHP-FPM:

location ~ \.php$ {
    include /etc/nginx/fastcgi_params;
    fastcgi_pass unix:/run/php/php-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
    fastcgi_param DOCUMENT_ROOT $realpath_root;
}

Документация:

https://nginx.org/en/docs/http/ngx_http_core_module.html#try_files https://nginx.org/en/docs/http/ngx_http_core_module.html#location

В определении server_name описывается, как создавать переменные при использовании регулярных выражений:

https://nginx.org/en/docs/http/ngx_http_core_module.html#server_name

Ответ или решение

Перемещение с веб-сервера Apache на NginX может быть довольно сложной задачей для IT-специалистов, особенно если вы сталкиваетесь с проблемами переадресации и использования устаревших ссылок, как в данной ситуации с файлами .html и .php. Рассмотрим, как решить вашу задачу с использованием возможностей NginX.

Теория

В Apache переадресация и обработка отсутствующих файлов часто осуществляется с помощью правил перезаписи в .htaccess, что достаточно удобно для выполнения подобной задачи. В вашем случае, как вы уже упомянули, NginX предлагает директиву try_files, которая может помочь обрабатывать случаи, когда определенный файл не найден, и попытаться использовать другую версию файла, если она существует.

Однако try_files не поддерживает регулярные выражения, как это делают правила перезаписи в Apache. Несмотря на это, NginX предоставляет возможность использовать регулярные выражения в location блоках, что делает возможной реализацию необходимого функционала, если правильно сконфигурировать сервер.

Пример

Ваша цель заключается в том, чтобы веб-сервер пытался использовать .php файлы в случае, если запрашиваемый .html файл отсутствует. Следующий метод базируется на использовании переменных и регулярных выражений в блоках location, и позволяет достичь необходимого поведения.

Вот конфигурация, которую вы можете использовать:

server {
    listen 80;
    server_name yourdomain.com;

    location ~ ^(?<filename>.+)\.html$ {
        try_files $uri $filename.php =404;
        default_type text/html;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
    }
}
  • Директива location ~ ^(?<filename>.+)\.html$: Здесь используется регулярное выражение, которое захватывает имя файла без расширения. Это обозначение (?<filename>.+) задает переменную $filename, содержащую путь к файлу без расширения .html.

  • Директива try_files: Если файл с расширением .html не найден, NginX попытается использовать файл с расширением .php с тем же именем. Если и файл .php отсутствует, сервер возвращает ошибку 404.

  • default_type text/html;: Устанавливает тип содержимого по умолчанию, что может предотвратить проблемы с неправильной отправкой файлов.

  • Блок для обработки PHP: Этот блок обеспечивает правильную передачу запросов на обработку PHP-скриптов, используя PHP-FPM.

Применение

Применение представленной конфигурации NginX решает проблему использования устаревших ссылок на .html файлы, подстраиваясь под существующие .php файлы без необходимости перенаправления большого числа запросов через отдельные правила. Данный подход экономит время на управление большим числом правил перезаписи, делая конфигурацию более гибкой и устойчивой к будущим изменениям.

Таким образом, этот способ позволяет плавно мигрировать с Apache на NginX, минимизируя негативное влияние на пользователей вашего веб-сайта и сохраняя доступ к важным ресурсам через привычные URL’ы.

Если возникнут дополнительные сложности с конфигурацией или обработкой специфических случаев, всегда целесообразно обратиться к документации NginX или сообществу для получения более детальных советов и указаний. Это поможет сохранить высокое качество обслуживания ваших клиентов и надежность веб-сервера.

Оцените материал
Добавить комментарий

Капча загружается...