Laravel 5 - Удалить общедоступный из URL-адреса


Я знаю, что это очень популярный вопрос, но я не смог найти рабочего решения для Laravel 5. Я уже давно пытаюсь перейти с Codeigniter, но этот запутанный процесс установки продолжает меня отталкивать.

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

Я не хочу устанавливать корневой каталог своего документа в общую папку, это также неудобно при переключении между проектами.

Я пробовал.htaccess метод mod_rewrite

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

Это просто дает мне исключение Laravel NotFoundHttpException в compiled.php строка 7610.

Когда я некоторое время назад попробовал L4, я использовал метод перемещения содержимого общей папки в корневой каталог. Структура L5 совершенно иная и, следуя тем же шагам, полностью сломала Laravel (сервер возвращал только пустую страницу).

Существует ли достойный метод удаления "общедоступного" в среде разработки, который:

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

Спасибо

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

Author: user1537360, 2015-02-06

22 answers

Для Laravel 5:

  1. Переименуйте server.php в корневой папке Laravel в index.php
  2. Скопируйте файл .htaccess из каталога /public в корневую папку Laravel .

Вот и все!!:)

 330
Author: Asfaq Tamim, 2017-04-16 20:19:35

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

  1. Переименование server.php чтобы index.php (без изменений)
  2. Скопируйте файл .htaccess из общей папки в корневую папку (как сказал римон.экджон ниже)
  3. Изменение.htaccess это немного следующим образом для статики:

    RewriteEngine On
    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [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/$1/$2 [L,NC]
    

    Если есть какие-либо другие статические файлы, необходимые, просто добавьте расширение в предыдущий объявленный список

 95
Author: ka_lin, 2017-02-16 20:13:08

Простой способ удалить общедоступный URL-адрес из laravel 5. Вам просто нужно вырезать index.php и .htaccess из общедоступного каталога и вставьте его в корневой каталог, вот и все , и замените две строки в index.php как

require __DIR__.'/bootstrap/autoload.php';
$app = require_once __DIR__.'/bootstrap/app.php';
 40
Author: Muhammad Sadiq, 2015-04-29 11:00:27

@rimon.экджон сказал:

Переименовать server.php в корневой папке вашего Laravel, чтобы index.php и скопируйте файл .htaccess из каталога /public в корневую папку Laravel. -- Вот и все!!:)

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

Я изменил функцию /Illuminate/Foundation/helpers.php/asset() следующим образом:

function asset($path, $secure = null)
{
    return app('url')->asset("public/".$path, $secure);
}

Теперь все работает :)

Спасибо @rimon.ekjon и всем вам.

 34
Author: Miron, 2015-09-11 09:22:26

В 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 ^ ^$1 [N]

    RewriteCond %{REQUEST_URI} (\.\w+$) [NC]
    RewriteRule ^(.*)$ public/$1 

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ server.php

</IfModule>
 30
Author: Raham, 2018-01-29 04:11:53

1) Я не нашел рабочего метода перемещения общедоступного каталога в L5. В то время как вы можете изменить некоторые вещи в начальной загрузке index.php , похоже, что несколько вспомогательных функций основаны на предположении, что этот общедоступный каталог существует. В общем, честно говоря, вам действительно не следует перемещать общедоступный каталог.

2) Если вы используете MAMP, то вам следует создавать новые vhosts для каждого проекта, каждый из которых обслуживает общедоступный каталог проектов. После создания вы получаете доступ к каждому проекту с помощью ваше определенное имя сервера. http://project1.dev, http://project2.dev

 21
Author: Jeremy Schaffer, 2015-02-08 01:38:43

Просто создайте .htaccess файл в корневом каталоге и добавьте в него следующие строки

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

Вот и все!

Приведенный выше код работает в корневой папке public_html. Сказав, что ваш основной файл laravel должен находиться в папке public_html, если ваш каталог выглядит как public_html/laravelapp/public, и если вы поместите приведенный выше код в laravelapp, он не будет работать. Поэтому вы должны скопировать все ваши основные файлы в public_html и поместить туда файл .htaccess.

Если вы хотите чтобы сохранить код в подкаталоге, вы можете создать поддомен, тогда этот код будет работать и для этого.

 14
Author: Abhinav Saraswat, 2018-07-03 06:20:42

В laravel5 можно удалить public из URL-адреса. Выполните следующие действия:

Шаг 1 скопируйте весь файл из общедоступного и вставьте в корневой каталог

Шаг 2 открыть index.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';

И удалите весь кэш и файлы cookie.

 11
Author: piyush patel, 2015-02-24 08:22:08

Допустим, вы поместили все остальные файлы и каталоги в папку с именем "locale".

enter image description here

Просто перейдите к index.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';
 10
Author: Angelo Joseph Salvador, 2015-02-19 17:26:17

Я хотел бы добавить в @Humble Learner и отметить, что правильное расположение для "исправления" URL-адреса для ресурсов - /Осветить/Маршрутизация/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, '/');
}

Это исправит сценарии, стили и пути к изображениям. Все, что угодно, для путей к активам.

 6
Author: Sean Perkins, 2015-11-02 03:10:56

МЕТОД 1:

Я просто переименовываю server.php в index.php, и это работает

СПОСОБ 2:

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

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

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

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

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

Требуется РЕЖ..'/../bootstrap/autoload.php ';

До

Требуется РЕЖ..'/bootstrap/autoload.php ';

И

$app =требуется_онсе РЕЖ..'/../bootstrap/start.php ';

До

$app =require_once РЕЖ..'/bootstrap/start.php ';

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

'общедоступный' => РЕЖ..'/../ публичный",

До

'общедоступный' => РЕЖ..'/..',

И все, теперь попробуйте http://localhost/laravel/

 6
Author: Wasim A., 2016-09-14 12:25:29

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

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

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

 3
Author: Reiah Paul Sam, 2017-04-19 10:29:17

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

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

  2. Перейдите к C:/xampp/apache/conf/extra или туда, где находятся ваши файлы XAMPP.

  3. Откройте файл с именем httpd-vhosts.conf с текстовым редактором.

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

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

<VirtualHost *>
    ServerAdmin [email protected]
    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 [email protected]
    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. Ищите #разрешение имен локального хоста обрабатывается в самой DNS.

127.0.0.1 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 и протестируйте все.

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

 3
Author: sunny kashyap, 2018-01-27 09:05:26

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

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

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

Несмотря на то, что все файлы PHP имеют суффикс файла .php, злоумышленник может получить доступ ваш каталог $LARAVEL_PATH/storage и его содержимое подкаталогов, прочитайте ваш composer.json или package.json, чтобы найти уязвимые зависимости, или прочитайте файл .env и т. Д.

Если вы работаете на общем хостинге и у вас есть обязательный public_html, попробуйте установить Laravel вне этого каталога public_html и либо удалите public_html (если он пустой) и замените его символической ссылкой на $LARAVEL_PATH/public, ЛИБО, если вы хотите, чтобы экземпляр Laravel был подкаталогом public_html, сделайте то же самое, но создайте символическую ссылку с $LARAVEL_PATH/public на public_html/$PROJECT_SUBDIR.

Это публичное каталог существует для того, чтобы сделать проект немного более безопасным. Решите реальную проблему и не пытайтесь нарушить это простое, но приятное дополнение безопасности. :)

Надеюсь, это поможет.

 3
Author: Mittul At TechnoBrave, 2018-09-25 05:23:18

Во-первых, вы можете использовать следующие шаги

Для Laravel 5:

1. Переименовать server.php в вашей корневой папке Laravel, чтобы index.php

2. Скопируйте файл .htaccess из каталога /public в корневую папку Laravel.

источник: https://stackoverflow.com/a/28735930

После того, как вы выполните эти действия, вам нужно изменить все css и путь к сценарию, но это будет утомительный.

Предложение решения: просто вы можете внести незначительные изменения в функцию helpers::asset.

Для этого:

  1. Открыть vendor\laravel\framework\src\Illuminate\Foundation\helpers.php

  2. Линия перехода 130

  3. Напишите "public/".$path вместо $path,

    function asset($path, $secure = null){
       return app('url')->asset("public/".$path, $secure);
    }
    
 1
Author: Ferhat KOÇER, 2018-08-14 21:39:06

Другой метод, который я использую, заключается в создании символической ссылки (в Linux, не знаю о Win) с помощью команды ln в htdocs или www, т.е. ln projectname/public project Таким образом, сайт доступен через localhost/project

 0
Author: Eli Makumba, 2016-11-15 15:26:57

Я уже читал одну статью, и она работает нормально, но на самом деле не знаю, безопасно это или нет

    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. 

Редактировать index.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';
 0
Author: Yousef Altaf, 2017-02-10 15:31:52

Даже если я не рекомендую помещать Laravel в корневую папку, есть некоторые случаи, когда этого нельзя было избежать; в этих случаях вышеуказанные методы не работают для ресурсов, поэтому я быстро исправил изменение htaccess: после копирования server.php чтобы index.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/$1 -f
    #redirect to /public/<filename>
    RewriteRule ^(.*)$ public/$1 [L]
    ###############

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [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>

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

 0
Author: Plokko, 2017-09-13 20:12:59
 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) 
 0
Author: Yagnesh bhalala, 2017-11-10 13:41:10

Ларавель 5.5

После первой установки Laravel я столкнулся с известной "проблемой общих папок" и придумал это решение, которое, по моему личному мнению, "чище", чем другие, которые я нашел в Интернете.


Достижения

  • Нет public слова в URI
  • Защитите файл .env от любопытных людей

Все можно сделать, просто отредактировав .htaccess с помощью mod_rewrite и четырех простых правила.


Шаги

  1. Переместите файл .htaccess в 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[=$1]/whatever[=$2] => server loads the resource at public/$1/$2
    # If R flag is added, the server not only loads the resource at public/$1/$2 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/$1/$2 [L,NC]
    # --- END

</IfModule>

Следующее правило (первоначально в public/.htaccess) может быть удалено. То же самое правило, по сути, более подробно изложено в двух последних правилах.

# Handle Front Controller...
#    RewriteCond %{REQUEST_FILENAME} !-d
#    RewriteCond %{REQUEST_FILENAME} !-f
#    RewriteRule ^ index.php [L]

РЕДАКТИРОВАТЬ: Я пропустил Решение Абхинава Сарасвата и его ответ должны быть принятыми. Только одно простое и понятное правило, которое перенаправляет весь трафик в общую папку без изменения какого-либо файла.

 0
Author: Brigo, 2018-01-27 22:13:08

Шаг 1: server.php файл в корневом каталоге переименовать как index.php

Шаг 2:

Скопируйте файл .htaccess из общего каталога в корневой директорий

 0
Author: Ravindra Bhanderi, 2018-03-03 18:17:40

Вот лучшее и самое короткое решение, которое работает для меня по состоянию на мая 2018 года для Ларавеля 5.5

1 - просто удалите свой файл .htaccess из каталога /public в корневой каталог и замените его содержимое следующим кодом:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [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/$1/$2 [L,NC]

</IfModule>

2 - Просто сохраните файл .htaccess, и это все. наслаждайтесь!

 0
Author: tony pro, 2018-05-17 09:46:48