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

Сайт на 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, но я свою задачу решил ))

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

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

nailfor

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

dax

так будет Явно работать :)

set $root_path /var/www/qwe/data/www/qwe.com/public; #laravel
    location / {
        try_files $uri $uri/ /index.php?$query_string; #laravel
        location ~ [^/]\.ph(p\d*|tml)$ {
            try_files /does_not_exists @php;
        }
    }
    location @php {
        fastcgi_index index.php;
        fastcgi_param PHP_ADMIN_VALUE "sendmail_path = /usr/sbin/sendmail -t -i -f webmaster@iva3.kelme.md";
        fastcgi_pass unix:/var/www/php-fpm/qwe.sock;
        fastcgi_split_path_info ^((?U).+\.ph(?:p\d*|tml))(/?.+)$;
        try_files $uri =404;
        include fastcgi_params;
    }
    root $root_path;

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

Разметка: ? ?

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