Назад | Перейти на главную страницу

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 папки не указаны, и приложение не работает. Поэтому я ищу способ переписать его, не исключая внутренние папки.

Сброс вашего документа root вернуться наверх. Попробуй это:

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;
}

Видеть этот и этот для большего.