Nginx перезаписывает URI чтобы удалить префикс?

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

Правило перезаписи, которое я хочу, заключается в том, чтобы принимался только любой URL-адрес с префиксом / foobar / с / foobar / stripped прочь, пока он не ударил Вот эквивалентное правило перезаписи в моей конфигурации 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;

    # This is what I have tried adding, to no avail
    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" is a docker container

        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;
    }
}
0
задан 23 December 2017 в 12:56
1 ответ

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

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

location ~ ^/foobar(/.*)$ {
    fastcgi_connect_timeout 3s;
    fastcgi_read_timeout 10s;
    fastcgi_pass app:9000;     # "app" is a docker container

    include fastcgi_params;
    fastcgi_param PATH_INFO $1;
    fastcgi_param SCRIPT_FILENAME $document_root/index.php;
}
0
ответ дан 5 December 2019 в 07:00

Теги

Похожие вопросы