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?


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


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


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]

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


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]

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.


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í !! :)


2

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

sudo a2enmod rewrite

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.


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.

0
 RewriteEngine on

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

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

use isso em .htaccess e reinicie o servidor


0

Espero que isso ajude como ajudou a mim.

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

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

0

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



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]

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

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 /

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.