Laravel 5 - Видаліть загальнодоступне з URL-адреси


241

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

Я не хочу запускати VM, це просто здається незручним при переключенні між проектами.

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

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

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

Це якраз і дає мені Laravel NotFoundHttpException у рядку 7610, складеному.

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

Чи є гідний метод усунення "громадськості" в середовищі розвитку, який:

  1. Працює з L5
  2. Дозволяє мені легко перемикатися між проектами (я зазвичай працюю над 2 або 3 в будь-який час).

Дякую

** Я використовую MAMP і PHP 5.6.2


1
Структура папок у посібнику відрізняється від моєї, я думаю, він не використовує L5? Я пропустив зміни, які він вніс у файл Bootstrap / Paths, оскільки його не існує. Проект, здається, працює. Ви вважаєте, це нормально?
користувач1537360

моя помилка, дозвольте мені додати відповідь за L5
kamlesh.bar

успіху не намагається зробити те саме
kamlesh.bar

1
Здається, це працює, просто змінюючи шляхи у файлі index.php, але я новачок у Laravel, тому явно не можу коментувати, чи є це стабільним / безпечним.
користувач1537360

Інші папки / файли повинні бути під вашим корінцем документа.
Майк Рокетт

Відповіді:


431

Для Laravel 5:

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

Це воно!


105
Що таке може бути небезпечним, переконайтесь, що ніхто не може запитувати ваш .envфайл, якщо ви це робите, якщо ви не в порядку, якщо люди чітко проглядають пароль вашої бази даних;)
GabLeRoux

48
Це не працює, якщо ви посилаєтесь на свої активи, використовуючи відносний шлях від кореня, тобто. "/assets/styles.css" тощо. Я все ще намагаюся знайти найкращий спосіб розгорнути його через сервери
Ghazanfar Mir,

1
Це працює ... Але чи є якийсь наслідок / недолік у використанні цього? Багато хто пропонує налаштувати віртуальний хост або копіювати файли вручну тощо. Чи працює це також і у виробництві?
Bogz

1
@GabLeRoux <Files "log.txt">Order Allow,DenyDeny from all</Files>вирішує проблему, яку ви вирішили вирішити. Чи безпечно це зараз чи якийсь ризик?
Метелик

1
@Butterflyit залежить від конфігурації вашого сервера. Зазначене лише блокує log.txt. Просто переконайтеся, що ви блокуєте конфіденційні дані від загальнодоступних. Якщо ви користуєтесь Laravel і уважно читаєте документацію , буде виглядати ваша веб-програма project/public. Погляньте на цю дискусію про stackoverflow 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]

    Якщо є якісь інші статичні файли, потрібно просто додати розширення до попереднього оголошеного списку


1
привіт @KA_lin. Як я не можу комусь переглядати .env, як so localhost / oap / .env
Fokwa Best

8
RewriteRule ^.env - [F,L,NC]
Гмммм

2
Або <Files ~ "\.env$"> Order allow,deny Deny from all </Files>
ka_lin

Велике спасибі @ka_lin, чи є спосіб вилучити доступ через / public /? як-от www.yoursite.com працює, але www.yoursite.com/public також працює, чи можна видалити останній?
adaba

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

Дякую, це робота для мене. Але я хочу знати, що це питання щодо безпеки чи ні.
rahul singh Chauhan

@rahulsinghChauhan моє задоволення. Подивіться, я не знаю щодо проблеми безпеки, але це повинно бути захищено.
Рахам

2
Що це правило RewriteRule ^ ^$1 [N] робить?
gonzo

Це єдиний, хто працював на мене ... дуже дякую
Аршад Амінь

86

НЕ!

ВИ ДАЙТЕ НЕ ПРАВИЛИ перейменувати 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

Простий спосіб видалити публікацію з URL-адреси Laravel 5. Вам просто потрібно вирізати index.php та .htaccess з загальнодоступного каталогу та вставити його у кореневий каталог, це все і замінити два рядки в index.php як

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

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


1
Після цього css не завантажується, bcoz всі CSS публічні, а громадськість видаляється з URL
Mr. Tomar

1
Ви можете поставити "public /" перед файлами js або css під час завантаження, наприклад, Html :: script ("public / js / ....."); - Але найкращим рішенням буде віртуальний хост ...
Мухаммед Садік

39

@ rimon.ekjon сказав:

Перейменуйте server.php у вашій кореневій папці Laravel в index.php та скопіюйте .htaccess файл із / public каталогу у свою кореневу папку Laravel. -- Це воно !! :)

Це працює для мене. Але всі файли ресурсів у / public каталозі не вдалося знайти, а URL-адреси запиту не працювали, тому що я використовував помічник активу ().

Я змінив функцію /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.

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


Я відповів нижче, перш ніж прочитати вашу відповідь, і це має бути прийнятою відповіддю. Жодних змін у файлі: просто просте, розумне правило.
Бріго

@Raham, яка твоя поточна URL-адреса?
Абхінав Сарасват

2
Просто хочу додати короткий опис у верхній частині роботи цього джентльмена. Вищевказаний код працює у кореневій папці public_html (у мене також були проблеми). Сказавши, що ваш основний файл laravel повинен знаходитись у папці public_html, я допустив помилку, що мій каталог виглядав як public_html / laravelapp / public, якщо помістити вищезазначений код у laravelapp, він не буде працювати. Тому ви повинні скопіювати всі основні файли в public_html і покласти туди файл .htaccess. Посилання на хостинг centOS та Cpanel для laravel.
Діепеш Тапа

У чому недоліки використання цього методу?
Сценарій47

1
Я працював як шарм для мене, я мав лише cPanel webshost і не міг змінити 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';

І видаліть увесь кеш і файли cookie.


Привіт, я спробував ваш метод, виконав вищезазначені дії, але він показує такі помилки: Увага: Requ_once (D: \ Projects \ laravel / public / index.php): не вдалося відкрити потік: Немає такого файлу чи каталогу в D: \ Projects \ laravel \ server.php у рядку 21 Фатальна помилка: Requ_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

НАЙКРАЩИЙ підхід: я не рекомендую видаляти загальнодоступні, натомість 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. перемістити всі файли з загальнодоступного каталогу в root / laravel /
  2. зараз немає необхідності у загальнодоступному каталозі, тому за бажанням ви можете його видалити зараз
  3. тепер відкрийте index.php і зробіть наступні заміни

вимагають DIR . '/ .. / bootstrap / autoload.php';

до

вимагають DIR . '/ bootstrap / autoload.php';

і

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

до

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

  1. тепер відкрийте bootstrap / paths.php та змініть шлях публічного каталогу:

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

до

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

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


Все в порядку. але команда artisan не працює, вона просто показує "Не вдалося відкрити вхідний файл: artisan". Чи є якась пропозиція?
Кабір Хоссейн

Цей метод спрацював. Якщо ви все в порядку розкривати користувацькі дані своєї бази даних. localhost / laravel / .env
MasoodUrRehman

8

4 найкращі способи видалення публіки з URL-адреси.

Якщо ви використовували будь-який інший трюк для видалення загальнодоступного з URL-адреси, наприклад, змінює ім'я server.php на index.php та переходить у основний шлях до файлу. Ясна річ, не робіть цього. Тоді чому Ларавель не дає такого рішення, оскільки це не правильний спосіб зробити це.

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) Видаліть публіку, створивши віртуальний хост у вашому локальному

Я демонструю тут демонстрацію для операційної системи Window. Але я спробую визначити крок, щоб кожен міг легко слідувати кроку. Ви також можете досліджувати 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"файл. Тепер додайте в нього наступний код.

Примітки: Змініть корінь документа відповідно до вашого проекту, також додайте доменне ім’я, як ви визначаєте у файл "хостів".

<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 видаляв загальнодоступні з 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. Тепер ви можете скопіювати і вставити код вище, щоб додати свої каталоги Virtual Host. Наприклад, я працюю на сайті під назвою 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 , де розміщено файл. Відкрийте його за допомогою блокнота.
  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 і протестуйте все.

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


5

Завжди є причина, щоб мати загальнодоступну папку в налаштуваннях Laravel. Усі елементи, пов’язані з громадськістю, повинні бути присутніми у загальній папці,

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

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


3

Я знаю, що для вирішення цього питання дуже багато. Найкраще і найпростіше рішення - додати .htaccess файл у кореневій каталог.

Я спробував відповіді, які ми надали для цього питання, проте я зіткнувся з деякими проблемами з auth: api guard у Ларавелі.

Ось оновлене рішення:

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

EDIT: Я пропустив рішення Абхінава Сарасвата , і його відповідь повинна бути прийнятою. Просто одне, просте і зрозуміле правило, яке перенаправляє весь трафік у загальнодоступну папку, не змінюючи жодного файлу.


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. goto line 130

  3. пишіть "public/".$pathзамість $path,

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

2
Правило № 1: Ніколи не редагуйте основний файл. Навіть якщо зараз це виглядає легко і приємно, ви заплатите пізніше.
Janaka Dombawela

@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

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>

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


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

цей код коду видалить публікацію з URL-адреси та надасть номер 404, а потім переспрямує до URL-адреси без загальнодоступних


0

Інший метод, який я використовую, - це створити символічне посилання (в Linux, не знаю про Win) за допомогою команди ln в htdocs або www, тобто ln projectname/public project сайт доступний через localhost / project


0

Ви можете видалити відкрите ключове слово з URL, використовуючи різні методи.

1) Якщо ви використовуєте виділений хостинг і маєте root-доступ, тоді ви можете видалити відкрите ключове слово з URL за допомогою Virtual Host. Вам слід надати шлях DocumentRoot із загальнодоступним. Таким чином, це запустить індекс із загальнодоступного каталогу та видалить його з 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? Також, я сподіваюся, у вас немає проекту в підкаталозі з головного каталогу?
Віктор Іфеаній Ехіогу

Проект root, версія - 5.6. * - Він знаходиться на піддомені, хоча на спільному хостингу; на жаль, ця установка cPanel змушує субдомени мати папку у public_html
zanderwar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.