Решил поделиться, т.к. настройка 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)
Мысль у меня возникает только одна "Дядя Вова, ты..?" В смысле нафига??? И доколе??? php-fpm, не?
так будет Явно работать :)