Как я могу удалить «public / index.php» из URL, созданного Laravel?

93

Мне нужно удалить 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.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
Указывает

Ответы:

131

Вариант 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".

Затем переместите все из общего каталога в корневую папку. Это должно привести к чему-то похожему на это: enter image description here

После этого все, что нам нужно сделать, это отредактировать местоположения в 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';

Источник: Как удалить / public / из URL-адреса в Laravel

Лузан Барал
источник
5
Если вы используете Debian Linux, не забудьте редактировать etc/apache2/apache2.confизменяющегося от AllowOverride Noneдо , AllowOverride Allгде вы видите конфигурации каталога, <Directory /var/www/></Directory>.
Робин Гуд,
1
Мне достаточно было иметь файл .htaccess в моем корневом каталоге, чтобы он заработал.
Марио Родригес,
9
Переход в / root - не лучший совет в рабочем режиме! Есть причина, по которой существует
общая
Для обеспечения контроля работы правила перезаписи , что апач конфигурации <Directory ...конфигурации имеет AllowOverride All'что - то вроде этого: <Directory "/var/www/html/laravel/public"> Options Indexes FollowSymLinks MultiViews **AllowOverride All** </Directory>
Иафет Ongeri - inkalimeva
Что делать, если у меня нет доступа к конфигу на хостинге?
Питер
40

Я пробовал это на Laravel 4.2

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

надеюсь это работает

Теджас Джадхав
источник
1
Если принятый ответ Луазана не сработает, этого будет достаточно. Хотя я бы обязательно отредактировал файл index.php в общей папке, чтобы перенаправлять пользователей из общего доступа, если они перейдут прямо по этой ссылке.
Брэд Берд,
4
Файлы js и css больше не загружаются из
общей
@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

Вот и все.

Хандад Ниази
источник
Есть ли другие сложности, связанные с другими ссылками с сайта?
Haring10
Похоже, это отличное и простое решение. Но на самом деле, как сказал Харинг10. Есть ли с этим проблемы?
Питер
12

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
Пробовал свои шаги. Результатов пока нет! Я не знаю, почему это происходит!
Мостафиз Рахман
Предоставьте информацию журнала, чтобы мы могли отследить основную причину
Орхидея
Вот полный файл журнала: dropbox.com/s/8fhlbej86nqr5qj/laravel.log?dl=0
Мостафиз Рахман
работал у меня. Не заставляйте виртуальный хост переходить прямо в общую папку.
cardi777
Спасибо. Это сработало для меня, мойmod_rewrite был отключен.
Maubeh
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. Если возможно, сделайте это из другого источника с помощью хорошего руководства.

smcjones
источник
Отличный улов для настроек конфигурации apache2, я каждый раз скучаю по этой настройке.
Abhishek
4

Для Laravel 4 и 5:

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

Это оно !! :)

Абхиджит Навгире
источник
2

Также убедитесь, что после редактирования файла .htaccess включена функция Rewrite Engline.

sudo a2enmod rewrite
Рафик Бари
источник
Хорошее наблюдение я был на новом сервере и на самом деле пришлось включить его (и добавить необходимые биты конфигурации апача, а) с помощью этого digitalocean.com/community/tutorials/...
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
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)/(public)/(index.php)/$ $1/$4 [L]
</IfModule>
онлайн
источник
3
Предлагает еще одно объяснение вашего решения
Наруто
-3

Согласно Laravel 5.3 вышеупомянутые вещи не будут работать должным образом, но, пожалуйста, будьте спокойны и выполните следующие шаги:

Шаг 1. Перейдите внутрь проекта laravel.
Шаг 2. Создайте один случайный каталог / папку, например. laravelcode
Шаг 3. Переместить все папки и файлы ( за исключением публичной папки)
Шаг 4. Переместить все папки и файлы , которые находятся внутри публичной папки в Laravel проекта
Шаг 5. Теперь внутри Laravel проекта есть файл index.php, пожалуйста откройте его и измените пути к папкам для начальной загрузки в соответствии с новым путем, как ранее было «требуется DIR . '/ .. / bootstrap / autoload.php';» теперь он станет «требовать DIR . '/ laravelcode / bootstrap / autoload.php';»

Это просто запустите свой URL без public и index.php, как показано ниже http: // localhost / blog /

Амар Натх Джена
источник