Laravel 5 - Удалить Публичную из URL

241

Я знаю, что это очень популярный вопрос, но я не смог найти работающего решения для 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 полностью сломался (сервер вернул бы только пустую страницу).

Есть ли достойный метод удаления «public» в среде разработки, который:

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

Спасибо

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

user1537360
источник
1
Структура папок в руководстве отличается от моей, я думаю, он не использует L5? Я пропустил сделанные им изменения в файле Bootstrap / Paths, потому что он не существует. Похоже, проект работает. Как вы думаете, это нормально?
user1537360
моя ошибка позволила мне добавить ответ для L5
kamlesh.bar
безуспешно, пытаясь сделать то же самое
kamlesh.bar
1
Кажется, это работает, просто изменяя пути в файле index.php, но я новичок в Laravel, поэтому, очевидно, не могу комментировать, является ли это стабильным / безопасным.
user1537360
Другие папки / файлы должны находиться под корнем вашего документа.
Майк Рокетт

Ответы:

431

Для Laravel 5:

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

Это оно!

Асфак Тамим
источник
105
что это может быть небезопасно, убедитесь, что никто не может запросить ваш .envфайл, если вы делаете это, если вы не согласны с тем, что люди просматривают пароль вашей базы данных в виде
открытого
49
Это не будет работать, если вы ссылаетесь на свои активы, используя относительный путь от root, т.е. "/assets/styles.css" и так далее. Я все еще
пытаюсь
1
Это работает ... Но есть ли последствия / недостатки в использовании этого? Многие предлагают настроить виртуальный хост или копировать файлы вручную и т. Д. ... Это тоже работает в производстве?
Богз
1
@GabLeRoux <Files "log.txt">Order Allow,DenyDeny from all</Files>решает проблему, к которой вы обратились. Это сейчас безопасно или еще риск?
Бабочка
1
@Butterflyit зависит от конфигурации вашего сервера. Выше будет только блокировать log.txt. Просто убедитесь, что вы блокируете конфиденциальные данные от общественности. Если вы используете Laravel и внимательно прочитаете документацию , ваш webroot будет выглядеть так project/public. Взгляните на обсуждение стекопотока qa . Настройте свой веб-сервер и попробуйте на https://example.com/.envвсякий случай. Если вы видите свои пароли, считайте все взломанным и меняйте все пароли.
GabLeRoux,
126

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

  1. Переименование server.php в index.php (без изменений)
  2. Скопируйте .htaccess из общей папки в корневую папку (как указано ниже в rimon.ekjon)
  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]

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

ka_lin
источник
1
привет @KA_lin. Как мне запретить кому-то просматривать .env, например, localhost / oap / .env
Fokwa Best
8
Хммм ... попробуйRewriteRule ^.env - [F,L,NC]
ka_lin
2
Или <Files ~ "\.env$"> Order allow,deny Deny from all </Files>
ka_lin
Большое спасибо @ka_lin, есть ли способ затем удалить доступ через / public /? вроде www.yoursite.com работает, но www.yoursite.com/public также работает, возможно ли удалить последний?
Адаба
8
Это работает, но css, js и изображения не загружаются
Chetan Khandla
94

В 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>
Рахам
источник
5
лучший ответ! единственный, который работал в моем примере, у него должно быть определенно больше голосов «за»
FiliusBonacci
Спасибо, это работа для меня. Но я хочу знать, есть ли какие-то проблемы с безопасностью или нет.
Рахул Сингх Чаухан
@rahulsinghChauhan мое удовольствие. Уважаемый, я не знаю, что касается безопасности, но она должна быть безопасной.
Рахам
2
Что делает это правило RewriteRule ^ ^$1 [N]?
гонзо
Это единственный, который работал для меня ... большое спасибо
Аршад Амин
87

DO NOT!

ВЫ ДЕЙСТВИТЕЛЬНО НЕ СЛЕДУЕТ переименовывать server.phpв корневой папке Laravel index.php и копировать .htaccessфайл из /publicкаталога в корневую папку Laravel !!!

Таким образом, каждый может получить доступ к некоторым вашим файлам ( .envнапример). Попробуй сам. Вы этого не хотите!


ДЕЛАТЬ

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

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(.*)$ /public/$1 [L,QSA]

Это автоматически перезапишет все ваши базовые URI в /publicпапку. Даже все заголовки , например HTTP-заголовок авторизации и все необязательные параметры URI, также будут автоматически передаваться в /publicпапку.

Вот и все

Обратите внимание, когда настраиваете проект Laravel с помощью Docker: вам не нужно этого делать.

Дерк Ян Спилман
источник
2
Он работает нормально на производстве, но не работает на местном уровне, какие-либо предложения?
Харицин Гохил
2
Это прекрасно работает! Локальное и серверное спасибо за помощь в обеспечении безопасности!
Ghanshyam Nakiya
1
Здравствуйте, @DerkJanSpeelman. Я пытаюсь загрузить файлы laravel в подпапку моего хостинга, например: (example.com/projects/laravel/blog), в этом случае посетители должны посетить example.com/projects/laravel/blog/. public, чтобы я поместил файл .htaccess с вашим кодом в корень папки блога и хотел, чтобы он перенаправлялся в общую папку. Но это не работает. Вот что происходит: Запрошенный URL / общедоступный / не найден на этом сервере. Как я могу решить это?
Шовон Дас
1
Этот ответ недооценен. Проголосовал за жирный и выделено Не. Работает абсолютно нормально.
Варун Вед
2
Идеальный ответ
alnassre
43

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

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

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

Мухаммед Садик
источник
1
После этого css не загружается, bcoz все css находятся в открытом доступе, и публика удаляется из URL
Мистер Томар
1
Вы можете поместить "public /" перед файлами js или css во время загрузки, например, Html :: script ("public / js / ....."); - Но лучшим решением будет виртуальный хост ...
Мухаммед Садик
39

@ rimon.ekjon сказал:

Переименуйте файл 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 и всем вам.

Мирон
источник
3
Это не хороший способ решить эту проблему, так как вы пытаетесь обновить в каталоге поставщиков, что не является хорошей практикой.
Шадман
1
вам нужно только добавить RewriteRule ^(.*)$ public/$1 [L]в ваш файл .htaccess, который вы скопировали из публичного каталога, удалив эту строкуRewriteRule ^(.*)/$ /$1 [L,R=301]
Shadman
29

Просто создайте файл .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.

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

Абхинав Сарасват
источник
Я ответил ниже, прежде чем читать ваш ответ, и это должен быть принятый ответ. Нет изменений файла: просто простое, умное правило.
Бриго
@ Рахам, какой у тебя сейчас URL?
Абхинав Сарасват
2
Просто хочу добавить краткое описание поверх работы этого джентльмена. Приведенный выше код работает в корневой папке public_html (у меня тоже были проблемы). Сказав, что ваш основной файл laravel должен находиться в папке public_html, я сделал ошибку, что мой каталог выглядел как public_html / laravelapp / public, если вы поместите приведенный выше код в laravelapp, он не будет работать. Поэтому вы должны скопировать все ваши основные файлы в public_html и поместить туда файл .htaccess. Ссылка на CentOS и Cpanel хостинг для Laravel.
Дипеш Тхапа
В чем недостатки использования этого метода?
Script47 10.1018
1
Работал для меня как обаяние, у меня был только веб-хостинг cPanel и я не мог изменить RootDirectory для Apache. Спасибо ! самый простой и безопасный. Это не позволит увидеть содержимое вашей корневой папки
Vincent Decaux
27

Создайте .htaccessфайл в корневом каталоге и поместите код примерно так, как показано ниже.

<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>
Паллав Нагар
источник
1
Я действительно рекомендую это решение.
TheLastCodeBender
1
Я также рекомендую это решение
iglesiasedd
Огромное спасибо. Это идеально (у)
Праппо Ислам Принц
3
он работает нормально, но все же .env файл доступен прямо с URL.
Манодж Сингх
это безопасное решение?
Руководитель группы программистов PHP
23

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

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

http://project1.dev
http://project2.dev
Джереми Шаффер
источник
15

Можно удалить публичный URL в laravel5. Следуй этим шагам:

шаг 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';

И удалите весь кеш и куки.

Пиюш Патель
источник
Привет, я попробовал ваш метод, выполнил описанные выше шаги, но он показывает следующие ошибки: Предупреждение: require_once (D: \ Projects \ laravel / public / index.php): не удалось открыть поток: нет такого файла или каталога в D: \ Projects \ laravel \ server.php в строке 21 Неустранимая ошибка: require_once (): не удалось открыть обязательное 'D: \ Projects \ laravel / public / index.php' (include_path = '.; C: \ xampp \ php \ PEAR' ) в D: \ Projects \ laravel \ server.php в строке 21
Али Шахзад
Это не идеальный ответ, скорее это небезопасный путь.
Рохит
11

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

введите описание изображения здесь

Просто зайдите в 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';
Анджело Джозеф Сальвадор
источник
11

Вот лучшее и самое короткое решение, которое работает для меня на май 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 ^(.*)/$ /$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файл и все.

  3. Переименуйте ваш server.phpфайл в index.php. это все нравится!

Тони про
источник
9

ЛУЧШИЙ ПОДХОД: я не буду рекомендовать удаление public, on local computer create a virtual host point to public directoryа on remote hosting change public to public_html and point your domain to this directory. Причина в том, что весь ваш код laravel будет защищен, потому что он на один уровень ниже вашего публичного каталога :)

МЕТОД 1:

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

СПОСОБ 2:

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

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

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

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

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

требуют DIR . '/ .. / bootstrap / autoload.php';

в

требуют DIR . '/ bootstrap / autoload.php';

и

$ app = require_once DIR . '/ .. / bootstrap / start.php';

в

$ app = require_once DIR . '/ bootstrap / start.php';

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

'public' => DIR . '/ .. / public',

в

'public' => DIR . '/ ..',

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

Васим А.
источник
Это нормально для всего. но команда ремесленника не работает, просто она показывает "Не удалось открыть входной файл: ремесленник". Есть ли какие-либо предложения?
Кабир Хоссейн
Этот метод работал, если вы в порядке, чтобы предоставить свои учетные данные базы данных пользователям. localhost / laravel / .env
MasoodUrRehman
8

4 лучших способа убрать публичность с URL.

Если вы использовали какой-либо другой трюк для удаления публики из URL, например, измените имя server.php на index.php и измените путь к файлу ядра. Очевидно, не делай этого. Тогда почему Laravel не дает такого решения, потому что это неправильный способ сделать это.

1) Удалите общедоступный URL с помощью htaccess в Laravel

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

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

2) Удалите публику, создав виртуальный хост в вашем локальном

Я даю демо здесь для операционной системы Windows. Но я постараюсь определить шаг, чтобы любой мог легко следовать за ним. Вы также можете изучить Google для того же для конкретной операционной системы.

Шаг 1: Перейдите в C: \ Windows \ system32 \ drivers \ etc \, откройте файл "hosts" в режиме администратора.

Шаг 2: Добавьте следующий код к нему. Здесь я даю вам демонстрацию демо доменного имени projectname.local, вы можете указать любой, как вам нравится. Просто сделайте это постоянным в любом месте.

127.0.0.1  projectname.local

Шаг 3: Теперь перейдите, C:\xampp\apache\conf\extraдля пользователей xampp и для пользователя wamp, "C:\wamp\bin\apache\Apache2.4.4\conf\extra"и откройте "httpd-vhosts.conf"файл. Теперь добавьте в него следующий код.

Примечания: Измените корневой каталог документа в соответствии с вашим проектом, а также добавьте имя домена, которое вы определили в файл «hosts».

<VirtualHost projectname.local>
      ServerAdmin projectname.local
      DocumentRoot "C:/xampp/htdocs/projectdir"
      ServerName projectname.local
      ErrorLog "logs/projectname.local.log"
      CustomLog "logs/projectname.local.log" common
 </VirtualHost>

Шаг 4: Последний, но важный шаг - перезапустить Xampp или Wamp и получить доступ к URL-адресу, http://projectname.localи ваш Laravel ответит без общедоступного URL.


3) Удалить публику, запустив команду в Laravel

Если вы работаете в локальном режиме, вам не нужно ничего делать, просто нужно выполнить следующую команду из своего терминала или инструмента командной строки. После этого вы можете получить доступ к своему веб-сайту по указанному URL-адресу из командной строки.

   > php artisan serve

Если вы хотите запустить свой проект на определенном IP-адресе, вам нужно выполнить следующую команду. Если вы работаете в локальной сети, то если вы хотите разрешить другим людям доступ к вашему веб-сайту из локальной сети, вам просто нужно проверить свой IP-адрес с помощью командной строки, запустив «ipconfig» после получения IP-адреса, запустив следующую команду.

> php artisan serve --host=192.168.0.177

Если вы хотите запустить свой проект на определенном IP-адресе с определенным портом, вам нужно выполнить следующую команду.

> php artisan serve --host=192.168.0.177 --port=77

4) Удалить публичный на размещенном сервере или на cpanel

введите описание изображения здесь

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

Как показано на скриншоте, если у вас нет публичной папки проекта в public_html, вам просто нужно установить корневой каталог вашего документа "public_html/public".

Ссылка взята отсюда

Маянк Дудакия
источник
1
Все четыре способа хороши, но я решил свою проблему, используя первое решение.
Маниша
7

Я хотел бы добавить к @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, '/');
}

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

Шон Перкинс
источник
6

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

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

солнечный кашьяп
источник
5

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

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

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

Рея Пол Сэм
источник
3

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

Я попробовал ответы, которые мы предоставили для этой проблемы, однако я столкнулся с некоторыми проблемами с auth: api guard в Laravel.

Вот обновленное решение:

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

    RewriteEngine On
    RewriteCond %{HTTP:Authorization} ^(.*)
    RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]

    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>

Создайте файл .htaccess в корневом каталоге и добавьте этот код. И все идет хорошо

ЧАРИТРА ШРЕСТА
источник
2

Laravel 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]

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

Brigo
источник
2

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

Для 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);
    }
Ferhat KOÇER
источник
2
Правило № 1: Никогда не редактируйте основной файл. Даже если это выглядит легко и приятно сейчас, вы заплатите позже.
Джанака Домбавела
@JanakaDombawela Я так не думаю, потому что:
Ferhat KOÇER
@JanakaDombawela Я не думаю, что так, потому что: Senerio 1: если разработчик опытный: открытый исходный код для этой работы Senerio 2: если разработчик младший, разработчик должен редактировать исходный код для получения опыта
Ferhat KOÇER
2
<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteRule ^(.*)$ public/$1 [L]
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # 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]
</IfModule>

Активируйте модуль mod_rewrite с помощью

sudo a2enmod rewrite

и перезагрузите апач

sudo service apache2 restart

Чтобы использовать mod_rewrite из файлов .htaccess (что очень распространено), отредактируйте VirtualHost по умолчанию с

sudo nano /etc/apache2/sites-available/000-default.conf

Ниже «DocumentRoot / var / www / html» добавьте следующие строки:

<Directory "/var/www/html">
AllowOverride All
</Directory>

Перезагрузите сервер снова:

sudo service apache2 restart
mujuonly
источник
1

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

    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';
Юсеф Альтаф
источник
1

Даже если я не рекомендую помещать 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>

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

Plokko
источник
1

Проблема в том, что если вы напечатаете / public, и он все еще будет доступен в URL, для этого я создал исправление, которое должно быть помещено в public / index.php

  $uri = urldecode(
     parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)
  );

  if(stristr($uri, '/public/') == TRUE) {

    if(file_exists(__DIR__.'/public'.$uri)){

    }else{

      $actual_link = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}";
      $actual_link = str_replace('public/', '',$actual_link);
      header("HTTP/1.0 404 Not Found");
      header("Location: ".$actual_link."");
      exit();
      return false;
   }}

этот кодекс удалит public из url и даст 404, а затем перенаправит на url без public

Пол Де Цваан
источник
0

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

Эли Макумба
источник
0

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

1) Если вы используете выделенный хостинг и у вас есть root-доступ, вы можете удалить публичное ключевое слово из URL, используя Virtual Host. Вы должны указать путь к DocumentRoot с помощью public. Так что это запустит индекс из публичного каталога и удалит его из URL.

<VirtualHost *:80>
    ServerAdmin info@example.com
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/html/{yoursourcedirectory}/public

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

2) Если у вас нет корневого доступа к вашему хостингу, вам следует создать новый файл .htaccess в корневом каталоге и поместить код, как показано ниже.

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

Вы можете получить больше ссылок здесь.

Винод Джоши
источник
0

Создайте файл .htaccess в корневой директории и поместите код, как показано ниже.

<IfModule mod_rewrite.c>
 #Session timeout

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

Создайте файл .htaccess в каталоге / public и поместите код, как показано ниже.

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

RewriteEngine On

# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

# 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]
</IfModule>
Ганшьям Накия
источник
-1

Я нашел самое рабочее решение этой проблемы.

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

RewriteEngine on
RewriteCond %{REQUEST_URI} !^public
RewriteRule ^(.*)$ public/$1 [L]

<IfModule php7_module>
   php_flag display_errors Off
   php_value max_execution_time 30
   php_value max_input_time 60
   php_value max_input_vars 1000
   php_value memory_limit -1
   php_value post_max_size 8M
   php_value session.gc_maxlifetime 1440
   php_value session.save_path "/var/cpanel/php/sessions/ea-php71"
   php_value upload_max_filesize 2M
   php_flag zlib.output_compression Off
</IfModule>
АХИЛ РАДЖ
источник
-1

я попробовал какое-то решение здесь и нашел htaccess, который работает для laravel 5.2, например так:

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

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(css|js|images)/(.*)$ public/$1/$2 [L,NC]
RewriteRule ^.env - [F,L,NC]
RewriteRule ^app - [F,L,NC]
RewriteRule ^bootstrap - [F,L,NC]
RewriteRule ^config - [F,L,NC]
RewriteRule ^database - [F,L,NC]
RewriteRule ^resources - [F,L,NC]
RewriteRule ^vendor - [F,L,NC]

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

RewriteRule ^your_file - [F,L,NC]
Адам
источник
-1

Вам не нужно ничего делать, просто создайте файл .htaccess в корневом каталоге и вставьте / сохраните нижеприведенное;

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
Виктор Ифеани Эджиогу
источник
Это перенаправляет меня в / public / public
zanderwar
@zanderwar, пожалуйста, что за версия Laravel? Кроме того, я надеюсь, что у вас нет своего проекта в подкаталоге основного каталога?
Виктор Ифеани Эджиогу
Проект является корневым, версия 5.6. * - Он находится на поддомене, но на общем хостинге; к сожалению, эта установка cPanel вынуждает субдомены иметь папку в public_html
zanderwar