Como posso remover “public / index.php” da URL gerada pelo Laravel?

93

Preciso remover index.phpou public/index.phpda URL gerada no Laravel; comumente o caminho é localhost/public/index.php/someWordForRoute, deve ser algo comolocalhost/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',

Como posso mudar isso?

TuGordoBello
fonte
7
URLs bonitos no Laravel . Certifique-se de que mod_rewriteestá ativado.
Kryten
@Kryten doesnt work = /
TuGordoBello
2
Esta é a solução quando a outra solução não funciona dev-metal.com/enable-mod_rewrite-ubuntu-14-04-lts
TuGordoBello
A raiz do seu documento está apontando para a pasta pretendida, ou seja/var/www/project_name/public
Kiee

Respostas:

131

Opção 1: use .htaccess

Se ainda não estiver lá, crie um arquivo .htaccess no diretório raiz do Laravel. Crie um .htaccessarquivo no diretório raiz do Laravel, se ainda não existir. (Normalmente está na sua public_htmlpasta)

Edite o arquivo .htaccess para que contenha o seguinte código:

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

Agora você deve conseguir acessar o site sem a parte "/public/index.php/".

Opção 2: Mova as coisas do diretório '/ public' para o diretório raiz

Crie uma nova pasta em seu diretório raiz e mova todos os arquivos e pastas, exceto a pasta pública. Você pode chamá-lo do que quiser. Vou usar "laravel_code".

Em seguida, mova tudo do diretório público para a pasta raiz. Deve resultar em algo semelhante a este: insira a descrição da imagem aqui

Depois disso, tudo o que precisamos fazer é editar os locais no laravel_code/bootstrap/paths.phparquivo e no index.phparquivo.

Em laravel_code/bootstrap/paths.phpencontrar a seguinte linha de código:

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

E altere-os para:

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

Em index.php, encontre estas linhas:

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

E altere-os para:

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

Fonte: Como remover / public / da URL no Laravel

Luzan Baral
fonte
5
Se você usa Debian Linux, não se esqueça de editar a etc/apache2/apache2.confmudança de AllowOverride Nonepara AllowOverride Allonde você vê a configuração do diretório <Directory /var/www/></Directory>,.
Robin Hood de
1
Eu só precisava ter o arquivo .htaccess no meu diretório raiz para fazê-lo funcionar.
Mário Rodrigues
9
Mudar para / root não é um bom conselho no modo de produção! Há uma razão pela qual a pasta pública existe
toesslab
Para garantir que as regras de reescrita funcionem, verifique se a configuração do apache <Directory ...tem AllowOverride All'algo parecido com isto: <Directory "/var/www/html/laravel/public"> Options Indexes FollowSymLinks MultiViews **AllowOverride All** </Directory>
Japheth Ongeri - inkalimeva
E se eu não tiver acesso de configuração na hospedagem?
Peter
40

Eu tentei isso no Laravel 4.2

Renomeie o server.phpna pasta raiz do Laravel para index.phpe copie o .htaccessarquivo do /publicdiretório para a pasta raiz do Laravel.

eu espero que dê certo

Tejas Jadhav
fonte
1
Se a resposta aceita pelo Luazan não funcionar, isso será suficiente. Embora eu tenha certeza de editar o arquivo index.php na pasta pública para redirecionar os usuários fora do público se eles forem direto para esse link.
Brad Bird,
4
Os arquivos js e css não são mais carregados da pasta pública
llioor de
@MaHDyfo - por que não é seguro? e como ?
151291
2
@ 151291 porque o arquivo .env está acessível para todos que visitam seu site desta forma. a menos que você proteja seu servidor web para evitar isso.
Mahdyfo
17

Não se confunda com outra opção do snippet abaixo que estou usando e será útil para você também. Coloque os htacces abaixo em sua raiz.

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

Vá para o seu diretório público e coloque outro arquivo htaccess com o trecho de código abaixo

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

Está funcionando... !!!

Laravel usa abaixo .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]
Ankit Vishwakarma
fonte
Ótimo: você pode me dizer quais são os prós e os contras desse método?
Muhammad Ateek
Só editei o .htaccess na raiz (seu primeiro snippet) e isso consertou para mim, obrigado!
peird
13

AQUI ESTÃO PASSOS SIMPLES PARA REMOVER PÚBLICO EM URL (Laravel 5)

1: Copie todos os arquivos da pasta pública e cole-os na pasta raiz do laravel

2: Abra index.php e mude

De

 require __DIR__.'/../bootstrap/autoload.php';

Para

 require __DIR__.'/bootstrap/autoload.php';

E

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

Para

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

No laravel 4, o caminho 2 é em $app = require_once __DIR__.'/bootstrap/start.php';vez de$app = require_once __DIR__.'/bootstrap/app.php';/app.php

É isso.

Khandad Niazi
fonte
Existem outras complicações em relação a outros links do site?
Haring10
Parece uma ótima solução e simples também. Mas realmente, como disse Haring10. Existe algum problema com isso?
Peter
12

1) Verifique se mod_rewrite está habilitado. Vá para o /etc/apache2/mods-enableddiretório e veja se o rewrite.loadestá disponível. Caso contrário, ative-o usando o comando sudo a2enmod rewrite. Ele irá ativar o módulo de reescrita. Se já estiver habilitado, ele mostrará a mensagem Module rewrite already enabled.
2) Crie um host virtual para diretório público para que ao invés de dar http://localhost/public/index.phppossamos usar assim http://example.com/index.php. [portanto, o nome da pasta pública será ocultado]
3) Em seguida, crie um .htaccess que ocultará o index.php de sua url, que deve estar dentro do diretório raiz (pasta pública)

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?/$1 [L]
Orquídea
fonte
1
Tentei seus passos. Ainda não obteve resultado! Eu não sei porque isso está acontecendo!
Mostafiz Rahman
Forneça as informações de registro para que possamos rastrear a causa raiz
Orchid
Aqui está o arquivo de registro completo: dropbox.com/s/8fhlbej86nqr5qj/laravel.log?dl=0
Mostafiz Rahman
trabalhou para mim. Não faça o host virtual ir direto para a pasta pública.
cardi777
Obrigado. Isso funcionou para mim, meu mod_rewriteestava desativado.
Maubeh de
5

Isso provavelmente tem muito pouco a ver com o Laravel e tudo a ver com suas configurações do Apache.

Você tem acesso à configuração do servidor Apache? Em caso afirmativo, verifique isso, nos documentos:

Em geral, você só deve usar arquivos .htaccess quando não tiver acesso ao arquivo de configuração do servidor principal. Há, por exemplo, um equívoco comum de que a autenticação do usuário deve sempre ser feita em arquivos .htaccess e, nos anos mais recentes, outro equívoco de que as diretivas mod_rewrite devem ir para arquivos .htaccess. Isso simplesmente não é o caso. Você pode colocar as configurações de autenticação do usuário na configuração do servidor principal, e esta é, de fato, a maneira preferida de fazer as coisas. Da mesma forma, as diretivas mod_rewrite funcionam melhor, em muitos aspectos, na configuração do servidor principal.

... Em geral, o uso de arquivos .htaccess deve ser evitado sempre que possível. Qualquer configuração que você considere colocar em um arquivo .htaccess pode ser feita com a mesma eficácia em uma seção do arquivo de configuração do servidor principal.

Fonte: documentação do Apache .

Menciono isso primeiro porque é melhor se livrar .htaccesscompletamente, se possível, e usar uma Directorytag dentro de outra VirtualHost. Dito isso, o resto vai assumir que você está seguindo o .htaccesscaminho por qualquer motivo.

Para quebrar isso, algumas coisas podem estar acontecendo:

  1. Noto, talvez inutilmente, que seu arquivo foi mencionado .htaccesem sua pergunta. Meu palpite é que é um erro de digitação, mas no caso de você ter esquecido e na verdade está faltando apenas o segundo s, esse é exatamente o tipo de pequeno erro que me deixaria batendo minha cabeça contra a parede em busca de algo mais desafiador .

  2. Seu servidor não pode estar permitindo .htaccess. Para verificar isso, vá para o arquivo de configuração do Apache. Em compilações modernas do Apache, isso geralmente não está em um arquivo de configuração, portanto, certifique-se de usar aquele que aponta para seu aplicativo, onde quer que ele exista. mudança

    AllowOverride none
    

    para

    AllowOverride all
    

    Como acompanhamento, os documentos do Apache também recomendam que, por motivos de segurança, você não faça isso para todas as pastas se .htaccessfor reescrever. Em vez disso, faça isso para as pastas que você precisa adicionar .htaccess.

  3. Você mod_rewritehabilitou? Isso pode estar causando os problemas. Percebi que você tem a etiqueta no topo <IfModule mod_rewrite.c>. Experimente comentar essas tags e reinicie o Apache. Se você receber um erro, provavelmente é porque você precisa habilitar mod_rewrite: How to enable mod_rewrite para Apache 2.2

Espero que isto ajude. Eu mencionei alguns dos problemas mais comuns, mas existem vários outros que podem ser mais mundanos ou exclusivos. Outra sugestão em um servidor de desenvolvimento? Reinstale o Apache. Se possível, faça-o de uma fonte diferente com um bom tutorial.

smcjones
fonte
Grande pegadinha para as configurações do apache2, sinto falta dessa configuração sempre.
Abhishek de
4

Para Laravel 4 e 5:

  1. Renomear server.phpna pasta raiz do Laravel paraindex.php
  2. Copie o .htaccessarquivo do /publicdiretório para a pasta raiz do Laravel .

É isso aí !! :)

Abhijeet Navgire
fonte
2

Certifique-se também de que Rewrite Engline está ligado após editar o arquivo .htaccess

sudo a2enmod rewrite
Rafik Bari
fonte
Boa observação, eu estava em um novo servidor e na verdade tive que habilitá-lo (e adicionar os bits necessários na configuração do apache também) usando este digitalocean.com/community/tutorials/…
cdsaenz
1

O Laravel já vem com um URL bonito .htaccess ... você deve estar pronto para sair da caixa ... http://laravel.com/docs/installation#pretty-urls

Certifique-se de que mod_rewrite esteja habilitado e que seu caminho inicial esteja definido como o diretório público de seu aplicativo.

Kisuka
fonte
Ativei mod_rewritee copiei o código que está nessa página e ainda sem funcionar
TuGordoBello
1
Certifique-se de que no Apache seu caminho esteja configurado para a pasta pública de seu aplicativo.
Kisuka
ServerAdmin webmaster@localhost DocumentRoot /home/web-apps/myproject/public
TuGordoBello
Você reiniciou o apache após habilitar o mod_rewrite?
Kisuka
Tenho uma pasta chamada useré o local onde guardo as fotos, também tenho um arquivo blade chamado user, quando escrevo na URL myproject.com/userme mostra o conteúdo da pasta, as imagens
TuGordoBello
1

Você deve executar as seguintes etapas para fazer isso, que são as seguintes

  • Mapeie seu domínio para a pasta pública do seu projeto (ou seja, / var / www / html / yourproject / public) (se estiver usando Linux)

  • Vá para sua pasta pública e edite seu .htaccessarquivo lá

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>


  • As últimas três regras são para se você está acessando diretamente qualquer rota sem https, ele protege isso.
Shahrukh Anwar
fonte
0
 RewriteEngine on

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

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

use isso em .htaccess e reinicie o servidor

Uma corrida
fonte
0

Espero que isso ajude como ajudou a mim.

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

Acabei de instalar o Laravel 5 para um projeto e há um arquivo na raiz chamado server.php.

Altere para index.phpe funciona ou digite terminal:

$cp server.php index.php
Samuel Kwame Antwi
fonte
0

Renomeie o server.phpna pasta raiz do Laravel para index.phpe copie o .htaccessarquivo do /publicdiretório para a pasta raiz do Laravel.

Rizwan Taj
fonte
0

Se você usar o IIS Windows Server, adicione o web.configarquivo na pasta raiz e coloque o código abaixo:

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

e se você usar, .htaccess use este:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
Abd Abughazaleh
fonte
-3
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)/(public)/(index.php)/$ $1/$4 [L]
</IfModule>
site online
fonte
3
Fornece mais explicações para a sua solução
Naruto
-3

De acordo com o Laravel 5.3, as coisas acima não funcionarão corretamente, mas por favor, fique calmo e siga os passos abaixo:

Etapa 1. Vá para dentro do projeto laravel
Etapa 2. Faça um diretório / pasta aleatório, por exemplo. laravelcode
Etapa 3. Mover todas as pastas e arquivos (exceto a pasta pública )
Etapa 4. Mover todas as pastas e arquivos que estão dentro da pasta pública para o projeto laravel
Etapa 5. Agora dentro do projeto laravel há o arquivo index.php, por favor abra isso e mude os caminhos da pasta para o bootstrap de acordo com o novo caminho, como anteriormente era "require DIR . '/ .. / bootstrap / autoload.php';" agora será necessário "exigir DIR . '/ laravelcode / bootstrap / autoload.php';"

É só executar sua url sem public e index.php como abaixo http: // localhost / blog /

amar nath jena
fonte