Как объединить два правила в конфигурационном файле nginx?

Как объединить два закомментированных правила вместе, чтобы если файла нет, запрос перенаправлялся на index.php, а затем убиралось расширение .php с файлов идущих после перенаправления?
  • 4 января 2024 г. 16:09
Ответы на вопрос 1
Чтобы объединить два правила в конфигурации сервера nginx, так что первое правило перенаправляет все запросы к несуществующим файлам на `index.php`, а второе убирает расширение `.php` в URL, вам понадобится использовать директиву `try_files` вместе с блоком `location`.

Пример конфигурации для объединения таких правил:

```nginx
server {
    # ... остальная часть конфигурации ...

    location / {
        # Попытка найти файл, если он не найден - перенаправляем на index.php
        try_files $uri $uri/ /index.php?$args;
    }

    # Разрешаем открытие PHP файлов без расширения .php
    location ~ ^(.+)\.php(/|$) {
        # Пропускаем только существующие .php файлы
        try_files $uri =404;

        # ФастКГИ или PHP-FPM параметры (зависит от вашей конфигурации)
        fastcgi_pass unix:/var/run/php/php-version-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param SCRIPT_NAME $fastcgi_script_name;
    }

    # Чтобы перенаправить URLs с .php на без расширения
    location ~ \.php$ {
        rewrite ^(.*)\.php$ $1 last;
    }
}
```

Обратите внимание, что в конфигурации используются регулярные выражения для обработки URL-адресов. В первом блоке `location /` мы пытаемся найти файл, и если он не найден, отдаем запрос скрипту `index.php`. Во втором блоке `location ~ ^(.+)\.php(/|$)` мы обрабатываем все запросы, которые оканчиваются на `.php` или следуют за ним с использованием PHP-FPM. Последний блок `location ~ \.php$` используется для перенаправления всех запросов с расширением `.php` на тот же путь без этого расширения.

Такой подход работает, если вы хотите скрыть расширение `.php` в URL, однако убедитесь, что ваше приложение или CMS поддерживает такое использование URL без расширений.

Не забудьте проверить конфигурацию nginx на наличие ошибок командой `nginx -t`, прежде чем перезагружать или перезапускать сервис:

```sh
sudo nginx -t
```

Если конфигурация в порядке, перезагрузите или перезапустите nginx, чтобы применить изменения:

```sh
sudo systemctl reload nginx
# или
sudo service nginx reload
```

Убедитесь, что ваш конфигурационный файл nginx соответствует спецификам вашей системы и потребностям, включая пути к файлам и параметры PHP-FPM.
Похожие вопросы