Может войдёшь?
Черновики Написать статью Профиль

Сайт на Laravel. Nginx + Apache

laravel request_uri nginx

Решил поделиться, т.к. настройка nginx зачастую съедает кучу нервов и времени, может кому-нибудь поможет.

Итак, ситуация: Есть сайт на laravel, разработанный, работающий. Но под управлением только apache, разработчики привычно копипастят в .htaccess сие

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_URI} !(/$|\.)
    RewriteRule (.*) %{REQUEST_URI}/ [R=301,L]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
</IfModule>

и всё тип-топ.

До тех пор пока не возникает задача переехать на боевой сервер. Сайт подразумевает приличную нагрузку 50 тыс уников в сутки на настоящий момент. До 150-200 в перспективе. Соответственно перед Apache стоит nginx. И вот тут возникает вопрос ... в такой конфигурации как правило нет mod_rewrite, его конечно можно включить, но его нет не просто так, а потому, что всеми перенаправлениями занимается nginx

Как видно из исходного .htaccess у сайта одна точка входа - /index.php

Собственно, сие не есть проблема, все запросы, что не есть статика кидаем на этот самый /index.php А вот тут оказывается, что обработчик урлов laravel заточен на REQUEST_URI, что строго говоря не совсем корректно. Если срабатывает

    RewriteRule ^ index.php [L]

то apache вежливо подставляет в REQUEST_URI исходный запрошенный URL, который laravel и разбирает. Хотя строго говоря, REQUEST_URI = /index.php

Вот nginx ведёт себя более строго, у него так и оказывается: REQUEST_URI = /index.php в итоге любая ссылка показывает первую страницу )) Возникает необходимость подсунуть в REQUEST_URI исходный URL Я решил эту задачу так: proxy_set_header Request-uri $request_uri;

вот только nginx не подменяет REQUEST_URI, а создаёт HTTP_REQUEST_URI т.е.

REQUEST_URI = /index.php
HTTP_REQUEST_URI = /some/orig/url/

Ну и прописал первой строчкой в index.php

if( $_SERVER['HTTP_REQUEST_URI'] )
    $_SERVER['REQUEST_URI'] = $_SERVER['HTTP_REQUEST_URI'];

и сайт взлетел, чего и вам желаю )))

P.S. Может можно явно переопределить из nginx REQUEST_URI, но я свою задачу решил ))

Как вы считаете, полезен ли этот материал? Да Нет

Комментарии (1)

nailfor

Мысль у меня возникает только одна «Дядя Вова, ты..?»
В смысле нафига? И доколе? php-fpm, не?

Написать комментарий

Разметка: ? ?

Авторизуйся, чтобы прокомментировать.