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" в среде разработки что:

  1. работает с L5
  2. позволяет мне легко переключаться между проектами (обычно я работаю над 2 или 3 в любое время).

спасибо

* * Я использую MAMP и PHP 5.6.2

22 ответов


Для Laravel 5:

  1. переименовать server.php в корневой папке Laravel в index.php
  2. скопировать С /public каталог к вашему корню Laravel папка.

вот оно !! :)


Я решил проблему, используя 2 ответа:

  1. переименование сервера.php для индексирования.php (без изменений)
  2. скопировать .htaccess файл из общей папки в корневую папку (как Римон.экджон сказал ниже)
  3. меняется .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 из url laravel 5. Вам просто нужно сократить индекс.php и .htaccess из общедоступного каталога и вставьте его в корневой каталог, вот и все и замените две строки в индексе.php как

require __DIR__.'/bootstrap/autoload.php';
$app = require_once __DIR__.'/bootstrap/app.php';

@rimon.сказал ekjon:

переименовать сервер.php в корневой папке Laravel для индексирования.php и скопируйте .файл htaccess из / public directory в корневую папку Laravel. -- Вот так !! :)

это работает для меня. Но все файлы ресурсов в / public directory не могли найти и запросить URL-адреса не работали, потому что я использовал Asset() helper.

Я изменил /осветить / Фонд / помощники.функция php / asset () как следует:

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. Хотя вы можете изменить некоторые вещи в индексе bootstrap.php, похоже, несколько вспомогательных функций основаны на предположении, что этот общедоступный каталог существует. В общем, честно говоря, вы действительно не должны перемещать общедоступный каталог.

2) Если вы используете MAMP, то вы должны создавать новые vhosts для каждого проекта, Каждый из которых обслуживает общий каталог проектов. После создания вы получаете доступ к каждому проекту по определенному имени сервера. http://project1.Дэв!--4-->, http://project2.Дэв!--4-->


просто создать .реврайт файл в корне и добавьте к нему эти строки

<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 скопируйте весь файл из public и вставьте в корневой каталог

Шаг 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".

enter image description here

просто перейдите к индексу.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 to index.php и работает

Метод 2:

это хорошо работает для всех версий laravel...

вот моя структура каталогов,

/laravel/
... app
... bootstrap
... public
... etc

следуйте этим простым шагам

  1. переместить все файлы из общего каталога в root / laravel/
  2. теперь нет необходимости в общедоступном каталоге, поэтому вы можете удалить его сейчас
  3. теперь откройте индекса.РНР и сделайте следующие замены

требуются реж.'/../ bootstrap / autoload.php';

to

требуются реж.'/bootstrap / autoload.php';

и

$приложение = им require_once реж.'/../ bootstrap / start.php';

to

$приложение = им require_once реж.'/bootstrap / start.php';

  1. теперь откройте bootstrap / пути.php и изменить путь к общедоступному каталогу:

'public'=>реж.'/../ public',

to

'public'=>реж.'/..',

и вот это, сейчас попробую http:// локальный/фреймворк Laravel/


всегда есть причина иметь общую папку в настройке Laravel, все связанные с общественностью материалы должны присутствовать внутри общей папки,

Не указывайте свой ip-адрес / домен в корневую папку Laravel, но укажите его в общую папку. Небезопасно указывать Ip сервера на корневую папку., потому что если вы не пишете ограничения в .htaccess, можно легко получить доступ к другим файлам.,

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


для пользователя XAMPP, чтобы удалить public из url, не касаясь Laravel файловая система по умолчанию, чтобы установить виртуальный хост для вашего приложения, чтобы сделать это jsut выполните следующие действия

  1. Откройте приложение панели управления XAMPP и остановите Apache. Имейте в виду, что поздние машины Windows могут запускать его как службу, поэтому установите флажок слева от модуля Apache.

  2. перейти к C:/xampp/apache/conf/extra или где бы ни находились ваши файлы XAMPP расположенный.

  3. откройте файл с именем httpd-vhosts.conf с помощью текстового редактора.

  4. вокруг строки 19 найти # NameVirtualHost *:80 и раскомментировать или удалить хэш.

  5. в самом низу файла добавьте следующий код:

<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>
  1. теперь вы можете скопировать и вставить код выше ниже, чтобы добавить каталоги виртуального хоста. Например, я работаю на сайте под названием 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>
  1. Далее перейдите к файлу хоста Windows Для редактирования хостов. файл будет расположен по адресу C:/Windows/System32/drivers/etc/hosts, где hosts-это файл. Откройте его с помощью блокнота.
  2. Поиск # 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.
  1. перезапустите Apache и проверьте все.

Оригинал статьи можно найти здесь


даже если эти решения работают для вас, ребята, я бы попросил вас не следовать этому. Вот почему.

вы должны указывать свой корень хоста Apache на вместо $LARAVEL_PATH.

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

хотя все файлы PHP имеют суффикс файла .php, злонамеренный пользователь может получить доступ к вашему $LARAVEL_PATH/storageкаталог и его содержимое подкаталога, прочитайте ваш composer.json или package.json чтобы найти уязвимые зависимости или прочитать .env файл 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 из / public directory в корневую папку 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';

to

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 и четыре простых правила.


шаги

  1. перемещение на public/.htaccess главная корневая
  2. изменить его, как показано ниже

я все прокомментировал, поэтому должно быть ясно (я надеюсь) и тем, кто никогда не использовал 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 из общего каталога в root direct


вот лучшее и кратчайшее решение, которое работает для меня с мая 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 - просто сохранить .htaccess file и это все. наслаждайтесь!