Вопрос или проблема
Я переместил свое приложение 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
- Файл в корневой директории вашего поддомена
Если у вас есть .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 ошибку.
- Файл
.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
), чтобы получить более детальную информацию о возникающих ошибках.