Вот простой метод, использующий только файл .htaccess
, помещенный в корневой каталог Laravel - например, наряду с app
, bootstrap
, config
, ... Никаких изменений в вашем коде не требуется.
Файл переписывает все запросы так, чтобы запрос /file.png
фактически возвращал /public/file.png
, а все остальное перенаправлялось на /public/index.php
. Это также гарантирует отсутствие доступа к папке вне папки public
, защищая таким образом любые конфиденциальные файлы, такие как .env
или database/*
.
.
Простой метод
Этот метод предполагает, что DOCUMENT_ROOT
правильно установлен вашим сервером Apache. Попробуйте сначала и используйте второй метод, только если он не работает на вашем сервере.
.htaccess
RewriteEngine on
# serve existing files in the /public folder as if they were in /
RewriteCond %{DOCUMENT_ROOT}public%{REQUEST_URI} -f
RewriteRule (.+) /public/$1 [L]
# route everything else to /public/index.php
RewriteRule ^ /public/index.php [L]
Немного более сложный метод
Если ваш сервер не установил DOCUMENT_ROOT должным образом, вам нужно будет использовать абсолютный путь в RewriteCond. То есть абсолютный путь к файловой системе сервера. Вы можете получить его, скопировав следующий скрипт в каталог, в котором будет находиться ваша установка Laravel, и перейдя по его URL-адресу - т.е. http://example.com/get_doc_root.php
.
get_doc_root.php
<?php
echo getcwd();
Это должно привести к чему-то вроде /var/www/example.com/web
. Используйте следующий файл .htaccess
и замените [[your path]]
на фактический путь, который вы получили.
.htaccess
RewriteEngine on
# serve existing files in the /public folder as if they were in /
RewriteCond [[your path]]/public%{REQUEST_URI} -f
RewriteRule (.+) /public/$1 [L]
# route everything else to /public/index.php
RewriteRule ^ /public/index.php [L]
В нашем примере строка RewriteCond будет выглядеть следующим образом:
RewriteCond /var/www/example.com/web/public%{REQUEST_URI} -f