Nginx переписал корень в подпапку без изменения корня сервера

Я пытаюсь переместить старое приложение на nginx с apache, но тут я завис.

/. Htaccess

RewriteEngine on
RewriteRule ^(.*) public/$1 [L]

/public/.htaccess

Options +Indexes +FollowSymLinks -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]

Структура действительно проста. В этом приложении есть

./application
    ./*back-end*
./vendor 
    ./*back-end includes*
./public 
    ./public/.htaccess <- this one
    ./*front-end*
./tests
./.htaccess <- this one

. Единственный способ, которым я заставил его работать, - это изменить сервер root на ./ public и добавить

location / {
    if (!-d $request_filename){ set $rule_0 1$rule_0; }
    if (!-f $request_filename){ set $rule_0 2$rule_0; }
    if ($request_filename !~ "-l"){ set $rule_0 3$rule_0; }
    if ($rule_0 = "321"){ 
        rewrite ^/(.+)$ /index.php?url=$1 last; 
    }
} #from winginx convertor

, но в этом случае я за пределами . Папки / public не учитываются, и приложение не работает. Поэтому я ищу способ его переписать, не исключая внутренние папки.

0
задан 2 March 2016 в 14:56
1 ответ

Сброс вашего документа корень наверх . Попробуйте следующее:

location / {
    try_files $uri $uri/ @public;
}
location @public {
    rewrite ^ /public$request_uri last;
}
location /public {
    try_files $uri $uri/ @rewrite;
}
location @rewrite {
    rewrite ^/(.*)$ /public/index.php?url=$1 last;
}

Первый и второй блоки местоположения будут обслуживать внутренние файлы и гарантировать, что все остальное будет перезаписано в папку / public (ваш первый набор правил .htaccess ).

Третий и четвертый блоки расположения будут обслуживать файлы из общей папки (если они существуют), а в противном случае вызывать сценарий /public/index.php .

Я предполагаю, что у вас уже есть блок местоположения PHP .

Вышеупомянутое может быть излишним (я просто слежу за вашей реализацией Apache), и это также может сработать (пропуская несколько шагов):

location / {
    try_files $uri $uri/ @rewrite;
}
location @rewrite {
    rewrite ^/(.*)$ /public/index.php?url=$1 last;
}

Если вы не против начальная косая черта в параметре url , его можно упростить до:

location / {
    try_files $uri $uri/ /public/index.php?url=$uri;
}

См. this и this для получения дополнительной информации.

0
ответ дан 5 December 2019 в 10:40

Теги

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