Задать вопрос
UnluckySerivelha
@UnluckySerivelha

Почему при редиректе добавляется /public?

Кратко проблема: при переходе на URL со слэшом на конце в URL 301 редиректа добавляется public и все ломается. Почему и как исправить?
Есть домен site.ru, в нем находится директория subdirectory, в ней находятся файлы laravel
В subdirectory .htaccess:
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
  RewriteRule ^ https://%1%{REQUEST_URI} [L,R=301]
  RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

В subdirectory/public .htaccess:
<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Internally rewrite Filament assets to prefixed path
    RewriteRule ^subdirectory/css/filament/(.*)$ css/filament/$1 [L]
    RewriteRule ^subdirectory/js/filament/(.*)$ js/filament/$1 [L]

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

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

    # Send Requests To Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

Настроены роуты, например есть URL: https://site.ru/subdirectory/categories/category1. Он корректно работает, но только пока открываю URL без слэша на конце. При переходе по URL https://site.ru/subdirectory/categories/category1/ происходит редирект на версию без слэша (как и должно быть), но добавляется public и получается неверная ссылка https://site.ru/subdirectory/public/categories/cat... Почему и как исправить?
  • Вопрос задан
  • 25 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 1
@dodo512
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]

В переменной %{REQUEST_URI} путь уже с папкой public /subdirectory/public/.
Нужно немного поменять шаблон в условии.
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^/subdirectory/public/(.+)/$
RewriteRule ^ /subdirectory/%1 [L,R=301]

Тут адрес будет без /public/

Ещё вариант брать путь сразу из RewriteRule там он без /subdirectory/public/.
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/$ /subdirectory/$1 [L,R=301]
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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