Laravel 5-удалить public из URL
Я знаю, что это очень популярный вопрос, но я не смог найти рабочее решение для Laravel 5. Я пытался мигрировать из Codeigniter в течение длительного времени, но этот запутанный процесс установки продолжает откладывать меня.
Я не хочу запускать виртуальную машину, это просто кажется неудобным при переключении между проектами.
Я не хочу устанавливать свой корень документа в общую папку, это также неудобно при переключении между проектами.
Я попробовал .метод С. htaccess и mod_rewrite
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ public/ [L]
</IfModule>
Это просто дает мне Laravel NotFoundHttpException в compiled.php строка 7610.
когда я попробовал L4 некоторое время назад, я использовал метод перемещения содержимого общей папки в корень. Структура L5 совершенно другая и после тех же шагов полностью сломал Laravel (сервер будет возвращать только пустую страницу).
есть ли достойный метод удаления "public" в среде разработки что:
- работает с L5
- позволяет мне легко переключаться между проектами (я обычно работаю над 2 или 3 в любое время).
спасибо
** Я использую MAMP и PHP 5.6.2
22 ответа:
Для Laravel 5:
- переименовать
server.php
в корневой папке Laravel вindex.php
- скопировать С
/public
каталог для вашего корня Laravel папка.вот оно !! :)
Я решил проблему, используя 2 ответа:
- переименование сервера.php для индексирования.php (без изменений)
- скопировать .htaccess файл из общей папки в корневую папку (как Римон.экджон сказал ниже)
меняется .htaccess это немного следующим образом для статики:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/$ / [L,R=301] RewriteCond %{REQUEST_URI} !(\.css|\.js|\.png|\.jpg|\.gif|robots\.txt)$ [NC] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !^/public/ RewriteRule ^(css|js|images)/(.*)$ public// [L,NC]
Если есть другие статические файлы нужно просто добавить расширение в предыдущий объявленный список
простой способ удалить public из laravel 5 url. Вам просто нужно сократить индекс.php и .htaccess из общего каталога и вставьте его в корневой каталог, вот и все и заменить две строки в индексе.php как
require __DIR__.'/bootstrap/autoload.php'; $app = require_once __DIR__.'/bootstrap/app.php';
@rimon.экджон сказал:
переименовать сервер.php в корневой папке вашего Laravel для индексирования.php и скопировать .htaccess файл из / общего каталога в корневую папку Laravel. -- Вот так !! :)
это работает для меня. Но все файлы ресурсов в каталоге / public не могли найти и запросить URL-адреса не работали, потому что я использовал Asset() helper.
Я изменил / осветить / Фонд / помощники.php / asset() функция as следует:
function asset($path, $secure = null) { return app('url')->asset("public/".$path, $secure); }
теперь все работает :)
спасибо @rimon.экджон и все вы.
в Laravel 5.5 создать .htacess файл в корневой каталог и разместил следующий код: -Ссылка
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews </IfModule> RewriteEngine On RewriteCond %{REQUEST_FILENAME} -d [OR] RewriteCond %{REQUEST_FILENAME} -f RewriteRule ^ ^ [N] RewriteCond %{REQUEST_URI} (\.\w+$) [NC] RewriteRule ^(.*)$ public/ RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ server.php </IfModule>
1) я не нашел рабочего метода для перемещения общего каталога в L5. Хотя вы можете изменить некоторые вещи в индексе начальной загрузки.php, похоже, несколько вспомогательных функций основаны на предположении о том, что общедоступный каталог существует. В целом, честно говоря, вы действительно не должны перемещать публичный каталог.
2) Если вы используете MAMP, то вы должны создавать новые vhosts для каждого проекта, Каждый из которых обслуживает общий каталог проектов. После создания вы получаете доступ к каждому проекту по определенному имени сервера. http://project1.Дев,http://project2.Дев
просто создать .htaccess файл в корне и добавить эти строки к нему
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^(.*)$ public/ [L] </IfModule>
вот именно!
приведенный выше код работает в корневой папке public_html. Сказав, что ваш основной файл laravel должен быть внутри папки public_html, если ваш каталог выглядит как public_html/laravelapp/public, и если вы поместите приведенный выше код внутри laravelapp, он не будет работать. Поэтому необходимо скопировать все файлы в public_html и поставить .htaccess файл есть .
Если вы хотите сохранить код в подкаталоге, то вы можете создать поддомен, то этот код будет работать и для этого.
можно удалить public из url в laravel5. Выполните следующие действия:
Шаг 1 скопируйте все файлы из общедоступного и вставьте в корневой каталог
Шаг 2 Открыть индекс.PHP-файл заменить на
require __DIR__.'/../bootstrap/autoload.php';
до
require __DIR__.'/bootstrap/autoload.php';
и
$app = require_once __DIR__.'/../bootstrap/app.php';
до
$app = require_once __DIR__.'/bootstrap/app.php';
и удалить все кэш и куки.
допустим, вы разместили все остальные файлы и каталоги в папке с именем 'locale'.
просто перейдите в индекс.PHP и найти эти две строки:
require __DIR__.'/../bootstrap/autoload.php'; $app = require_once __DIR__.'/../bootstrap/app.php';
и меняем их на это:
require __DIR__.'/locale/bootstrap/autoload.php'; $app = require_once __DIR__.'/locale/bootstrap/app.php';
Я хотел бы добавить в @Humble Learner и отметить, что правильное расположение для "исправления" url-пути для активов-это /Illuminate/Routing/UrlGenerator.php / asset ().
обновить метод, чтобы соответствовать:
public function asset($path, $secure = null) { if ($this->isValidUrl($path)) return $path; $root = $this->getRootUrl($this->getScheme($secure)); return $this->removeIndex($root).'/public/'.trim($path, '/'); }
это исправит скрипты, стили и пути к изображениям. Что угодно для путей активов.
метод 1:
Я просто переименовать
server.php
toindex.php
и работаетМетод 2:
это хорошо работает для всех версий laravel...
вот моя структура каталогов,
/laravel/ ... app ... bootstrap ... public ... etc
следуйте этим простым шагам
- переместить все файлы из общего каталога в root / laravel/
- теперь нет необходимости в общедоступном каталоге, поэтому вы можете удалить его сейчас
- теперь откройте индекса.РНР и сделайте следующие замены
требуются реж.'/../ bootstrap / autoload.php';
до
требуются реж.'/загрузки/Автозагрузка.php';
и
$app = require_once реж.'/../ bootstrap / start.php';
до
$app = require_once реж.'/bootstrap / start.php';
- теперь откройте bootstrap / пути.php и изменить путь к общедоступному каталогу:
'public'=>реж.'/../общественных',
до
'public'=>реж.'/..',
и вот это, сейчас попробую http:// локальный/фреймворк Laravel/
всегда есть причина иметь общую папку в настройке Laravel, все связанные с общественностью материалы должны присутствовать внутри общей папки,
Не указывайте свой ip-адрес / домен в корневую папку Laravel, а укажите его в общую папку. Это небезопасно, указывая IP-адрес сервера к корневой папке., потому что если вы не пишете ограничения в
.htaccess
, можно легко получить доступ к другим файлам.,просто напишите условие перезаписи в
.htaccess
файл и установите модуль перезаписи и включите модуль перезаписи, проблема, которая добавляет public в маршрут, будет решена.
для пользователя XAMPP, чтобы удалить public из url, не касаясь laravel по умолчанию файловая система должна установить виртуальный хост для вашего приложения, чтобы сделать это jsut выполните следующие действия
Откройте приложение панели управления XAMPP и остановите Apache. Имейте в виду, что поздние машины Windows могут запускать его как службу, поэтому установите флажок слева от модуля Apache.
перейти к
C:/xampp/apache/conf/extra
или где бы ни находились ваши файлы XAMPP расположенный.откройте файл с именем httpd-vhosts.конф с текстовым редактором.
вокруг линии 19 найти #
NameVirtualHost *:80
и раскомментировать или удалить хэш.в самом низу файла добавьте следующий код:
<VirtualHost *> ServerAdmin admin@localhost.com DocumentRoot "C:/xampp/htdocs" # change this line with your htdocs folder ServerName localhost ServerAlias localhost <Directory "C:/xampp/htdocs"> Options Indexes FollowSymLinks Includes ExecCGI Order allow,deny Allow from all </Directory> </VirtualHost>
- теперь вы можете скопировать и вставить код выше, чтобы добавить каталоги виртуальных хостов. Например, я работаю на сайте под названием Eatery Engine, поэтому следующий фрагмент позволит мне работать с поддоменами на моей локальной установке:
<VirtualHost eateryengine.dev> ServerAdmin admin@localhost.com DocumentRoot "C:/xampp/htdocs/eateryengine" # change this line with your htdocs folder ServerName eateryengine.dev ServerAlias eateryengine.dev <Directory "C:/xampp/htdocs/eateryengine"> Order allow,deny Allow from all </Directory> </VirtualHost>
- Далее перейдите к файлу хоста Windows Для редактирования ваших хостов. файл будет расположен по адресу
C:/Windows/System32/drivers/etc/hosts
, где hosts-это файл. Откройте его с помощью блокнота.- Поиск # localhost разрешение имен обрабатывается в самом DNS.
127.0.0.1 localhost
разрешение имен localhost обрабатывается в DNS себя.
127.0.0.1 localhost 127.0.0.1 eateryengine.dev #change to match your Virtual Host. 127.0.0.1 demo.eateryengine.dev #manually add new sub-domains.
- перезагрузите Apache и проверьте все.
Оригинал статьи можно найти здесь
даже если эти решения работают для вас, ребята, я бы попросил вас не следовать этому. Вот почему.
вы должны указывать свой корень хоста Apache на вместо
$LARAVEL_PATH
.смысл наличия подкаталога для www host root вместо project root заключается в том, что вы не просачиваете какие-либо файлы проекта через свой веб-сервер.
хотя все PHP файлы имеют расширение файла
.php
, злоумышленник может получить доступ к вашей$LARAVEL_PATH/storage
каталог и его содержимое подкаталога, прочитайте вашcomposer.json
илиpackage.json
чтобы найти уязвимые зависимости или прочитать.env
file etc.если вы работаете на общем хостинге и у вас есть обязательный
public_html
, попробуйте установить Laravel вне этогоpublic_html
каталог и либо удаление public_html (если пустой) и заменить его символической ссылкой на$LARAVEL_PATH/public
или если вы хотите, чтобы экземпляр Laravel был подкаталогомpublic_html
, сделать то же самое, но создать символическую ссылку из$LARAVEL_PATH/public
доpublic_html/$PROJECT_SUBDIR
.этот публичный каталог существует для того, чтобы сделать проект немного более безопасным. Решите актуальную проблему и не пытайтесь сломать это простое, но приятное дополнение безопасности. :)
надеюсь, что это помогает.
во-первых, вы можете использовать эти шаги
Для Laravel 5:
1. переименовать сервер.php в корневой папке Laravel для индексирования.php
2. скопировать .htaccess файл из / общего каталога в корневую папку Laravel.
источник:https://stackoverflow.com/a/28735930
после выполнения этих шагов, то вам нужно изменить все css и путь скрипта, но это будет утомительно.
Предложение Решения: просто вы можете сделать незначительные изменения
другой метод, который я использую, чтобы создать символическую ссылку (в Linux, не знаю о Win) с помощью команды ln в htdocs или www т. е.
ln projectname/public project
Таким образом, сайт доступен через localhost/project
Я читал некоторые статьи, и это работает нормально, но не знаю безопасно или нет
a. Create new folder local. b. Move all project into the local folder expect public folder. c. Move all the content of public folder to project root. d. Delete the blank public folder f. Edit the index file.
изменить индекс.php
require __DIR__.'/../bootstrap/autoload.php'; $app = require_once __DIR__.'/../bootstrap/app.php';
до
require __DIR__.'/local/bootstrap/autoload.php'; $app = require_once __DIR__.'/local/bootstrap/app.php';
даже если я не рекомендую помещать Laravel в корневую папку, есть некоторые случаи, когда этого нельзя было избежать; в этих случаях вышеуказанные методы не работают для активов, поэтому я быстро исправил изменение htaccess: после копирования сервера.php для индексирования.php редактировать .файл htaccess вот так:
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews </IfModule> RewriteEngine On ### fix file rewrites on root path ### #select file url RewriteCond %{REQUEST_URI} ^(.*)$ #if file exists in /public/<filename> RewriteCond %{DOCUMENT_ROOT}/public/ -f #redirect to /public/<filename> RewriteRule ^(.*)$ public/ [L] ############### # Redirect Trailing Slashes If Not A Folder... RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/$ / [L,R=301] # Handle Front Controller... #RewriteCond %{REQUEST_FILENAME} -d # comment this rules or the user will read non-public file and folders! #RewriteCond %{REQUEST_FILENAME} -f # RewriteRule ^ index.php [L] </IfModule>
Это было быстрое решение, которое я должен был сделать, поэтому любой может обновить его.
You can follow only 2 step 1- cut .htaccess from public folder and paste to root(mainFolder) 2- Rename server.php file to index.php AT your root dir. (mainFolder)
Laravel 5.5
после того, как я впервые установил Laravel, я столкнулся с известной "проблемой общих папок", и я придумал это решение, которое в моем личное мнение, это "чище", то другие я нашел в Интернете.
достижения
- нет
public
слово в URI- защитить
.env
файл против любопытных людейвсе можно сделать просто редактирование
.htaccess
используяmod_rewrite
и четыре простых правила.
шаги
- перемещение на
public/.htaccess
главная корневая- изменить его, как показано ниже
я все прокомментировал, так что это должно быть понятно (я надеюсь) и тем, кто никогда не использовал
mod_rewrite
(не то чтобы я эксперт, все наоборот). Кроме того, чтобы понять правила, должно быть ясно, что в Laravel, если Билл подключается кhttps://example.com
,https://example.com/index.php
загружается. Этот файл содержит только командуheader("refresh: 5; https://example.com/public/")
, который отправляет запросhttps://example.com/public/index.php
. В эту секундуindex.php
отвечает за загрузку контроллера и других вещей.# IfModule prevents the server error if the app is moved in an environment which doesn’t support mod_rewrite <IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews </IfModule> RewriteEngine On # RULES ORIGINALLY IN public/.htaccess --- # Redirect Trailing Slashes If Not A Folder... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] # Handle Front Controller... # RewriteCond %{REQUEST_FILENAME} !-d # RewriteCond %{REQUEST_FILENAME} !-f # RewriteRule ^ index.php [L] # Handle Authorization Header RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # --- END # PERSONAL RULES --- # All the requests on port 80 are redirected on HTTPS RewriteCond %{SERVER_PORT} ^80$ RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R,L] # When .env file is requested, server redirects to 404 RewriteRule ^\.env$ - [R=404,L,NC] # If the REQUEST_URI is empty (means: http://example.com), it loads /public/index.php # N.B.: REQUEST_URI is *never* actually empty, it contains a slash that must be set as match as below # .* means: anything can go here at least 0 times (= accepts any sequence of characters, including an empty string) RewriteCond %{REQUEST_URI} ^/$ RewriteRule ^(.*) /public/index.php [L] # If the current request is asking for a REQUEST_FILENAME that: # a) !== existent directory # b) !== existent file # => if URI !== css||js||images/whatever => server loads /public/index.php, which is responsible to load the app and the related controller RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule !^(css|js|images|media)/(.*)$ /public/index.php [L,NC] # If the current request is asking for a REQUEST_FILENAME that: # a) !== existent directory # b) !== existent file # => if URI == css||js||images[=]/whatever[=] => server loads the resource at public// # If R flag is added, the server not only loads the resource at public// but redirects to it # e.g.: bamboo.jpg resides in example.com/public/media/bamboo.jpg # Client asks for example.com/media/bamboo.jpg # Without R flag: the URI remains example.com/media/bamboo.jpg and loads the image # With R flag: the server redirects the client to example.com/public/media/bamboo.jpg and loads the image RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(css|js|images|media)/(.*)$ /public// [L,NC] # --- END </IfModule>
следующее правило (первоначально в
public/.htaccess
) можно удалить. То же самое правило, по сути, более подробно объясняется в последних двух правилах.# Handle Front Controller... # RewriteCond %{REQUEST_FILENAME} !-d # RewriteCond %{REQUEST_FILENAME} !-f # RewriteRule ^ index.php [L]
EDIT: Я скучала Абинав Сарасватс и его ответ должен быть принят. Только одно, простое и понятное правило, которое перенаправляет весь трафик в общую папку без изменения какого-либо файла.
Шаг 1: сервер.php файл в корневом каталоге переименовать как индекс.php
Шаг 2:
копировать .htaccess файл из общего каталога в корневой директории
вот лучшее и самое короткое решение, которое работает для меня с мая 2018 для Laravel 5.5
1 - просто
.htaccess
файл из каталога / public в корневой каталог и замените его содержимое следующим кодом:<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews </IfModule> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/$ / [L,R=301] RewriteCond %{REQUEST_URI} !(\.css|\.js|\.png|\.jpg|\.gif|robots\.txt)$ [NC] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ server.php [L] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !^/public/ RewriteRule ^(css|js|images)/(.*)$ public// [L,NC] </IfModule>
2 - просто сохранить и это все. наслаждайтесь!