Nginx переписывает URI для удаления префикса?

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

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

Правило переписывания, которое я хочу, состоит в том, чтобы принимались только URL-адреса, начинающиеся с /foobar/, при этом /foobar/ удаляется перед тем, как попасть в slim. Вот эквивалентное правило переписывания в моей конфигурации Apache, которое я ранее использовал и которое работало именно так, как мне нужно:

RewriteEngine On
RewriteRule ^/foobar(/.*) /foobar/public/index.php$1 [QSA,L]

Текущая работа с этим правилом переписывания заключается в том, что параметр $_SERVER[‘REQUEST_URI’] остается полным “http://localhost/foobar/test“, но путь (по которому Slim сопоставляет маршрут) — это просто “/test”, поэтому нам не нужно явно создавать группу маршрутов.

На данный момент моя конфигурация nginx выглядит так:

server {
    listen 80;
    server_name  www.mysite.com mysite.com;
    root /var/www/mysite/foobar/public;

    # Это то, что я пытался добавить, но без успеха
    rewrite ^/foobar(/.*) /index.php$1 break;

    try_files $uri /index.php;

    location /index.php {
        fastcgi_connect_timeout 3s;
        fastcgi_read_timeout 10s;
        fastcgi_pass app:9000;     # "app" — это контейнер Docker

        include fastcgi_params;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

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

Заранее спасибо!

Обновленная попытка:

server {
    listen 80;
    server_name  www.mysite.com mysite.com;
    root /var/www/mysite;
    index index.php;

    location ~ ^/foobar(/.*)$ {
        root /var/www/mysite/foobar/public;

        fastcgi_connect_timeout 3s;
        fastcgi_read_timeout 10s;
        fastcgi_pass app:9000;

        include fastcgi_params;
        fastcgi_param PATH_INFO $1;
        fastcgi_param SCRIPT_FILENAME $document_root/index.php;
    }
}

Вы правы, nginx имеет другую логику для перенаправлений.

Этот подход может работать для вас. Однако я не использовал nginx с программами, которые используют такие шаблоны, поэтому не уверен, сработает ли это. Также это может быть не оптимальный способ выполнения этого.

location ~ ^/foobar(/.*)$ {
    fastcgi_connect_timeout 3s;
    fastcgi_read_timeout 10s;
    fastcgi_pass app:9000;     # "app" — это контейнер Docker

    include fastcgi_params;
    fastcgi_param PATH_INFO $1;
    fastcgi_param SCRIPT_FILENAME $document_root/index.php;
}

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

Чтобы настроить Nginx для удаления префикса /foobar/ из URI перед передачей запроса вашему приложению на Slim, вам потребуется правильно сконфигурировать файл конфигурации сервера. Вот как это можно сделать:

server {
    listen 80;
    server_name www.mysite.com mysite.com;
    root /var/www/mysite;  # Основная директория вашего приложения

    # Обработчик для любого запроса с префиксом /foobar
    location ~ ^/foobar(/.*)$ {
        # Установка корня для доступа к файлам приложения Slim
        alias /var/www/mysite/foobar/public;  # Используем 'alias' для изменения точки доступа

        try_files $uri /index.php?$query_string;  # Пробуем найти файл, если не находим – переходим на index.php

        # Настройка FastCGI
        fastcgi_connect_timeout 3s;
        fastcgi_read_timeout 10s;
        fastcgi_pass app:9000;  # Имя вашего Docker-контейнера

        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $request_filename;  # Полный путь к исполняемому файлу
        fastcgi_param PATH_INFO $1;  # Передаем оставшуюся часть URI
    }

    # Обработка запросов к index.php, если необходимо
    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

Объяснение конфигурации:

  1. server: Определяет настройки для вашего виртуального хоста (серверного блока).

  2. *location ~ ^/foobar(/.)$**: Этот блок отвечает за обработку всех запросов, начинающихся с /foobar. Регулярное выражение захватывает весь путь, который следует после /foobar, и сохраняет его в $1.

  3. alias: Используется для изменения корневой директории к /var/www/mysite/foobar/public, что позволяет Nginx найти нужные файлы, не меняя структуру URL.

  4. try_files: Попытка найти файл по указанному пути. Если файл не найден, управление передается index.php. При этом $query_string гарантирует, что query-параметры сохранились.

  5. fastcgi_param: Передает необходимые параметры в FastCGI. SCRIPT_FILENAME указывает полный путь к запрашиваемому скрипту, а PATH_INFO передает часть URI, которая идет после /foobar.

Примечания:

  • Проверьте, что конфигурация вашего контейнера со службой PHP-FPM (или другой FastCGI) настроена правильно и слушает на порту 9000.
  • Не забудьте перезагрузить Nginx после внесения изменений в конфигурацию, чтобы они вступили в силу: sudo systemctl reload nginx.

Эта конфигурация позволит вам корректно обрабатывать запросы к приложению Slim с префиксом /foobar, удаляя его перед передачей на обработку.

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

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