Як я можу видалити “public / index.php” у створеному URL-адресі Laravel?


90

Мені потрібно видалити index.phpабо public/index.phpзгенерувати URL-адресу в Laravel; зазвичай шлях - localhost/public/index.php/someWordForRouteце має бути щось на зразокlocalhost/someWordForRoute.

.htaccess

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

RewriteEngine On

# Redirect Trailing Slashes.
RewriteRule ^(.*)/$ /$1 [L,R=301]

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

app / config / app.php

'url' => 'http://localhost',

Як я можу це змінити?


7
Гарні URL-адреси в Laravel . Переконайтеся, що mod_rewriteввімкнено.
Kryten


@Kryten не працює = /
TuGordoBello

2
Це рішення, коли інше рішення не працює dev-metal.com/enable-mod_rewrite-ubuntu-14-04-lts
TuGordoBello

Кореневий документ вашого документа вказує на передбачувану папку, тобто/var/www/project_name/public
Кі,

Відповіді:


129

Варіант 1: Використовуйте .htaccess

Якщо його ще немає, створіть файл .htaccess у кореневому каталозі Laravel. Створіть .htaccessфайл у своєму кореневому каталозі Laravel, якщо він ще не існує. (Зазвичай це знаходиться у вашій public_htmlпапці)

Відредагуйте файл .htaccess так, щоб він містив такий код:

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

Тепер ви повинні мати доступ до веб-сайту без частини "/public/index.php/".

Варіант 2: Перемістіть речі в каталозі '/ public' у кореневий каталог

Створіть нову папку у своєму кореневому каталозі та перемістіть усі файли та папки, крім загальної. Ви можете назвати це як завгодно. Я буду використовувати "laravel_code".

Далі перемістіть все із загальнодоступного каталогу у кореневу папку. Це має призвести до чогось подібного до цього: введіть тут опис зображення

Після цього нам залишається лише відредагувати розташування у laravel_code/bootstrap/paths.phpфайлі та index.phpфайлі.

В laravel_code/bootstrap/paths.phpзнайти наступний рядок коду:

'app' => __DIR__.'/../app',
'public' => __DIR__.'/../public',

І змінити їх на:

'app' => __DIR__.'/../app',
'public' => __DIR__.'/../../',

В index.php, знайти такі рядки:

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

І змінити їх на:

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

Джерело: Як видалити / загальнодоступну / з URL-адреси в Laravel


5
Якщо ви використовуєте Debian Linux, не забудьте редагувати etc/apache2/apache2.confзмінюється від AllowOverride Noneдо , AllowOverride Allде ви бачите конфігурації каталогу, <Directory /var/www/></Directory>.
Робін Гуд,

1
Мені потрібно було лише мати файл .htaccess у моєму кореневому каталозі, щоб він працював.
Маріо Родрігес,

8
Перехід до / root - це зовсім не гарна порада у виробничому режимі! Існує причина, чому існує загальнодоступна папка
toesslab

Щоб забезпечити роботу правил перезапису, переконайтесь, що конфігурація <Directory ...конфігурації apache має AllowOverride All'щось на зразок цього: <Directory "/var/www/html/laravel/public"> Options Indexes FollowSymLinks MultiViews **AllowOverride All** </Directory>
Japheth Ongeri - inkalimeva

Що робити, якщо у мене немає доступу до конфігурації на хостингу?
Пітер

40

Я спробував це на Laravel 4.2

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

Сподіваюся, це спрацює


1
Якщо прийнята відповідь Луазана не спрацює, цього буде достатньо. Хоча я б обов’язково відредагував файл index.php у загальнодоступній папці, щоб переспрямовувати користувачів поза загальним доступом, якщо вони переходять прямо за цим посиланням.
Brad Bird

4
Файли js та css більше не завантажуються із загальної папки
llioor

@MaHDyfo - чому це не безпечно? і як ?
151291

2
@ 151291, оскільки файл .env, доступний для всіх, хто відвідує ваш сайт таким чином. якщо ви не захистите свій веб-сервер, щоб уникнути цього.
Mahdyfo

17

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

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

Перейдіть до свого загальнодоступного каталогу та розмістіть інший файл htaccess із фрагментом коду нижче

<IfModule mod_rewrite.c>
    RewriteEngine On
    # Removes index.php from ExpressionEngine URLs  
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?url=$1 [PT,L]

</IfModule>

Це працює... !!!

Laravel використовує нижче .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]

Чудово: чи можете ви сказати мені, які плюси і мінуси цього методу?
Мухаммед Атеек

Я лише відредагував .htaccess у кореневій системі (ваш перший фрагмент), і це мені виправило, дякую!
peird

13

ТУТ ПРОСТІ КРОКИ ДЛЯ ВИДАЛЕННЯ ПУБЛІЧНОГО В URL-адресі (Laravel 5)

1: Скопіюйте всі файли із загальної папки та передайте їх у кореневу папку laravel

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

У laravel 4 шлях 2 $app = require_once __DIR__.'/bootstrap/start.php';замість$app = require_once __DIR__.'/bootstrap/app.php';/app.php

Це все.


Чи є інші ускладнення щодо інших посилань із сайту?
Харінг10

Це виглядає як чудове рішення, а також просто. Але насправді, як сказав Харінг10. Чи є з цим проблеми?
Пітер

10

1) Перевірте, чи увімкнено mod_rewrite. Перейдіть до /etc/apache2/mods-enabledкаталогу і подивіться, чи rewrite.loadдоступний. Якщо ні, увімкніть його за допомогою команди sudo a2enmod rewrite. Це ввімкне модуль перезапису. Якщо його вже ввімкнено, він покаже повідомлення Module rewrite already enabled.
2) Створіть віртуальний хост для загальнодоступного каталогу, щоб замість того, щоб надавати, http://localhost/public/index.phpми могли використовувати його таким чином http://example.com/index.php. [отже, назва загальної папки буде прихована]
3) Потім створіть .htaccess, який приховає index.php від вашої URL-адреси, яка повинна знаходитися всередині кореневого каталогу (загальної папки)

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?/$1 [L]

1
Спробував свої кроки. Результату ще немає! Я не знаю, чому це відбувається!
Мостафіз Рахман,

Дайте інформацію про журнал, щоб ми могли простежити першопричину
Орхідея


працював у мене. Не змушуйте віртуальний хост переходити прямо до загальної папки.
cardi777

Дякую. Це спрацювало для мене, моя mod_rewriteбула інвалідом.
Мобе

5

Це, ймовірно, має дуже мало спільного з Laravel і всім, що пов’язано з вашими конфігураціями Apache.

Чи маєте ви доступ до конфігурації сервера Apache? Якщо так, перевірте це в документації:

Загалом, файли .htaccess слід використовувати лише тоді, коли у вас немає доступу до основного файлу конфігурації сервера. Наприклад, існує поширена помилка, згідно з якою автентифікація користувача завжди повинна виконуватися у файлах .htaccess, а в останні роки - ще одна помилкова думка, що директиви mod_rewrite повинні входити у файли .htaccess. Це просто не так. Ви можете помістити конфігурації автентифікації користувачів у основну конфігурацію сервера, і це, насправді, кращий спосіб робити щось. Так само директиви mod_rewrite працюють краще, багато в чому, в конфігурації основного сервера.

... Загалом, слід уникати використання файлів .htaccess, коли це можливо. Будь-яку конфігурацію, яку ви б розглянули, додавши у файл .htaccess, можна так само ефективно зробити у розділі у вашому основному файлі конфігурації сервера.

Джерело: документація Apache .

Причина, чому я згадую це перше, полягає в тому, що найкраще повністю позбутися, .htaccessякщо можете, і використовувати Directoryтег усередині VirtualHostтегу. З огляду на це, решта цього буде припускати, що ви дотримуєтесь .htaccessмаршруту з будь-якої причини.

Щоб це розбити, може статися кілька речей:

  1. Зауважу, можливо, безглуздо, що .htaccesу вашому запитанні названо ваш файл . Я здогадуюсь, що це друкарська помилка, але, випадково ви пропустили її, і насправді просто не вистачає другої s, це саме така незначна помилка, через яку я бився головою об стіну в пошуках чогось більш складного .

  2. Ваш сервер не може дозволити .htaccess. Щоб перевірити це, перейдіть у файл конфігурації Apache. У сучасних збірках Apache це зазвичай не в одному конфігураційному файлі, тому переконайтеся, що ви використовуєте той, який вказує на вашу програму, де б вона не існувала. Зміна

    AllowOverride none
    

    до

    AllowOverride all
    

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

  3. Ви mod_rewriteвключили? Це може спричинити проблеми. Я помітив, що у вас є мітка вгорі <IfModule mod_rewrite.c>. Спробуйте прокоментувати ці теги та перезапустіть Apache. Якщо ви отримуєте помилку, то це, мабуть, тому, що вам потрібно ввімкнути mod_rewrite: Як увімкнути mod_rewrite для Apache 2.2

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


Чудовий підхід для налаштувань конфігурації apache2, я щоразу пропускаю це налаштування.
Абхішек

4

Для Laravel 4 і 5:

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

Це воно !! :)


2

Також переконайтеся, що Rewrite Engline увімкнено після редагування файлу .htaccess

sudo a2enmod rewrite

Гарне спостереження, я був на новому сервері і насправді мусив
cdsaenz,

1

Laravel поставляється з досить гарною URL-адресою .htaccess ... Вам слід добре вийти з коробки ... http://laravel.com/docs/installation#pretty-urls

Переконайтеся, що mod_rewrite увімкнено, а для вашого домашнього шляху встановлено загальнодоступний каталог вашої програми.


Я активував mod_rewriteі скопіював код на цій сторінці і досі не працює
TuGordoBello

1
Переконайтеся, що в Apache ваш шлях встановлений до загальної папки вашої програми.
Кісука

ServerAdmin webmaster@localhost DocumentRoot /home/web-apps/myproject/public
TuGordoBello

Ви перезапустили apache після увімкнення mod_rewrite?
Кісука

У мене називається папка user- це місце, де я зберігаю фотографії, також у мене називається файл леза user, коли я пишу в URL-адресі, myproject.com/userмені показує вміст папки, картинки
TuGordoBello

1

Для цього вам потрібно виконати наступні кроки, які є такими

  • Складіть карту свого домену до загальної папки вашого проекту (тобто / var / www / html / yourproject / public) (якщо використовується Linux)

  • Перейдіть у свою загальнодоступну папку, відредагуйте .htaccessтам свій файл

AddHandler application/x-httpd-php72 .php
<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 non-www to www
    RewriteCond %{HTTP_HOST} !^www\.
    RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

    # Redirect non-http to https
    RewriteCond %{HTTPS} off
    RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

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

    # Remove index.php
    RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
    RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L]
</IfModule>


  • Останні три правила стосуються, якщо ви маєте прямий доступ до будь-якого маршруту без https, це захищає це.

0
 RewriteEngine on

 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_FILENAME} !-d

 RewriteRule ^(.*)$ index.php/$1 [L]

скористайтеся цим у .htaccess та перезапустіть сервер


0

Сподіваюся, це допомагає так, як це було для мене.

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

0

Я щойно встановив Laravel 5 для проекту, і в кореневій папці є файл, який називається server.php.

Змініть його на, index.phpі він працює або введіть в терміналі:

$cp server.php index.php

0

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



0

Якщо ви використовуєте IIS Windows Server, додайте web.configфайл у кореневу папку та введіть код нижче:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Imported Rule 1" stopProcessing="true">
                    <match url="^(.*)$" ignoreCase="false" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{URL}" pattern="^system.*" ignoreCase="false" />
                    </conditions>
                    <action type="Rewrite" url="/index.php/{R:1}" />
                </rule>
                <rule name="Imported Rule 2" stopProcessing="true">
                    <match url="^(.*)$" ignoreCase="false" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
                        <add input="{R:1}" pattern="^(index\.php|images|robots\.txt|css)" ignoreCase="false" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="index.php/{R:1}" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

і якщо ви використовуєте, .htaccess використовуйте цей:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]


-3

Відповідно до Laravel 5.3 вищезазначені речі не працюватимуть належним чином, але будь ласка, будьте спокійні та дотримуйтесь наведених нижче кроків:

Крок 1. Перейдіть до внутрішньої частини проекту laravel
Крок 2. Створіть один випадковий каталог / папку, наприклад. laravelcode
Крок 3. Перемістіть всю папку та файли (крім загальної папки)
Крок 4. Перемістіть усі папки та файли, що знаходяться в загальній папці, до проекту laravel
Крок 5. Тепер усередині проекту laravel є файл index.php відкрийте це та змініть шляхи до папки для bootstrap відповідно до нового шляху, як це було раніше "вимагати DIR . '/ .. / bootstrap / autoload.php';" тепер це стане "вимагати DIR . '/ laravelcode / bootstrap / autoload.php';"

Ось він просто запускає вашу URL-адресу без public і index.php, як показано нижче http: // localhost / blog /

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.