Как правильно настроить .htaccess для приложения Laravel на поддомене?

Вопрос или проблема

Я переместил свое приложение Laravel с локального разработческого сервера на интернет-поддомен. На localhost все работает. Но когда я переношу приложение на поддомен, кажется, что .htaccess не может правильно обрабатывать перенаправления. Когда я ввожу в браузере sub.mydomain.com, он перенаправляет на sub.mydomain.com/public. Главная веб-страница отображается. Но когда я перехожу на страницу входа, возникает ошибка 500. Роут теперь sub.mydomain.com/public/login

Это работает только когда я вручную ввожу sub.mydomain.com/public/index.php/login

Я не знаю, почему это происходит, но на локальном сервере все работает отлично.

Мой корневой .htaccess:

RewriteEngine on

# Перенаправить конечные слэши, если это не папка...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]

RewriteCond %{REQUEST_URI} !^public

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

И мой /public .htaccess

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Обработка заголовка авторизации
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Перенаправить конечные слэши, если это не папка...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Отправка запросов контроллеру...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

Можете посоветовать, как правильно настроить htaccess, чтобы это работало должным образом?

Это моя конфигурация .htaccess, которую я использую в папке public

Options -MultiViews

RewriteEngine On

# Перенаправить конечные слэши, если это не папка...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]

# Обработка контроллера...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

# Обработка заголовка авторизации
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
</IfModule>

Перенаправление с http на https:

<VirtualHost *:80>
  ServerName yourdomain.com
  ServerAlias www.yourdomain.com
 
  DocumentRoot /var/www/html/public

  Redirect Permanent / https://yourdomain.com/

  ....
  ....

</VirtualHost>

<VirtualHost *:443>
  ServerName yourdomain.com
  ServerAlias www.yourdomain.com
 
  DocumentRoot /var/www/html/public

  Redirect permanent http://www.yourdomain.com/ https://yourdomain.com

  ....
  ....

 ErrorLog ${APACHE_LOG_DIR}/error.log
 CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Спасибо!

Ответ или решение

Для корректной настройки файлов .htaccess в приложении Laravel на поддомене, необходимо учитывать несколько ключевых моментов. Вы уже обратили внимание на то, что при переходе на поддомен вы сталкиваетесь с проблемами переадресации и ошибками. В этом ответе мы подробно рассмотрим, как правильно настроить .htaccess, чтобы избежать таких проблем.

Зачем нужен файл .htaccess?

Файл .htaccess позволяет настраивать конфигурацию веб-сервера Apache и управлять такими аспектами, как переадресация URL, доступ к ресурсам и другие параметры, влияющие на работу вашего приложения.

Настройка .htaccess для Laravel

Структура вашего проекта

Подразумевается, что структура вашего проекта Laravel следующая:

/var/www/html
    └── public
    └── app
    └── ...

Важно: Папка public должна быть корневой для вашего веб-сервера, то есть в настройках виртуального хоста вы указываете DocumentRoot /var/www/html/public.

Основные настройки файла .htaccess

  1. Файл в корневой директории вашего поддомена

Если у вас есть .htaccess файл в корневом каталоге вашего поддомена, убедитесь, что у вас следующая настройка:

<IfModule mod_rewrite.c>
    RewriteEngine On

    # Переадресация с www на без www (если необходимо)
    RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
    RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

    # Переадресация всех запросов в папку public
    RewriteCond %{REQUEST_URI} !^/public
    RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

Эта конфигурация будет работать с URI, отправленными к вашему поддомену, и не будет возвращать 500 ошибку.

  1. Файл .htaccess в папке public

Ваша конфигурация для public папки должна выглядеть примерно так:

<IfModule mod_rewrite.c>
    RewriteEngine On

    # Обработка заголовка авторизации
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Переадресация слешей в конце, если это не директория
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Отправляем запросы на Front Controller
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

Проблемы с 500 ошибкой

Ошибка 500 может быть связана с неправильными разрешениями на файлы или директории. Убедитесь, что права на директорию storage и bootstrap/cache установлены следующим образом:

chmod -R 775 storage
chmod -R 775 bootstrap/cache

Настройка виртуального хоста

Ваши настройки виртуального хоста выглядят хорошо, но убедитесь, что сервер отвечает на запросы к вашему поддомену и перенаправляет их в public директорию:

<VirtualHost *:80>
    ServerName sub.mydomain.com
    DocumentRoot /var/www/html/public

    <Directory /var/www/html/public>
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

<VirtualHost *:443>
   ServerName sub.mydomain.com
   DocumentRoot /var/www/html/public

   SSLEngine on
   SSLCertificateFile /path/to/certificate.crt
   SSLCertificateKeyFile /path/to/private.key

   <Directory /var/www/html/public>
       AllowOverride All
       Require all granted
   </Directory>
</VirtualHost>

Заключение

Следуя вышеизложенным рекомендациям, вы сможете корректно настроить .htaccess для вашего приложения Laravel на поддомене. Если после внесения изменений проблемы сохраняются, обязательно проверяйте логи сервера (обычно находятся по пути /var/log/apache2/error.log), чтобы получить более детальную информацию о возникающих ошибках.

Оцените материал
Добавить комментарий

Капча загружается...