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 166

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 из 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'.

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';

до

требуются реж.'/загрузки/Автозагрузка.php';

и

$app = require_once реж.'/../ bootstrap / start.php';

до

$app = require_once реж.'/bootstrap / start.php';

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

'public'=>реж.'/../общественных',

до

'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.конф с текстовым редактором.

  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.

смысл наличия подкаталога для 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 и четыре простых правила.


шаги

  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 файл из общего каталога в корневой директории

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