Laravel 5 - Remover público do URL


240

Sei que essa é uma pergunta muito popular, mas não consegui encontrar uma solução funcional para o Laravel 5. Venho tentando migrar do Codeigniter há muito tempo, mas esse processo de instalação complicado me deixa adiado.

Não quero executar uma VM, isso parece estranho ao alternar entre projetos.

Eu não quero definir a raiz do meu documento para a pasta pública, isso também é estranho ao alternar entre projetos.

Eu tentei o método .htaccess mod_rewrite

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

Isso me fornece uma NotFoundHttpException do Laravel na linha compiled.php 7610.

Quando tentei o L4 há algum tempo, usei o método de mover o conteúdo da pasta pública para a raiz. A estrutura do L5 é bem diferente e, seguindo os mesmos passos, o Laravel foi completamente quebrado (o servidor retornaria apenas uma página em branco).

Existe um método decente de remover 'público' em um ambiente de desenvolvimento que:

  1. Funciona com L5
  2. Permite alternar entre projetos com facilidade (geralmente trabalho em 2 ou 3 a qualquer momento).

obrigado

** Estou usando MAMP e PHP 5.6.2


1
A estrutura de pastas no guia é diferente da minha, imagino que ele não esteja usando L5? Omiti as alterações que ele fez no arquivo Bootstrap / Paths, porque ele não existe. O projeto parece estar funcionando embora. Você acha que está tudo bem?
User1537360

meu erro deixe-me acrescentar resposta para L5
kamlesh.bar

sem sucesso tentando há mesmo
kamlesh.bar

1
Parece funcionar apenas modificando os caminhos no arquivo index.php, mas eu sou novo no Laravel, então obviamente não posso comentar se isso é estável / seguro.
User1537360

As outras pastas / arquivos devem estar embaixo da raiz do documento.
Mike Rockétt

Respostas:


430

Para o Laravel 5:

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

É isso aí!


104
whatchout pois isso pode ser perigoso, certifique-se de que ninguém pode não solicitar o seu .envarquivo se você está fazendo isso a menos que você está ok com as pessoas vendo sua senha de banco de dados em texto claro;)
GabLeRoux

48
Isso não funcionaria se você estiver referenciando seus ativos usando o caminho relativo da raiz, ou seja. "/assets/styles.css" e assim por diante. Eu ainda estou lutando para encontrar melhor maneira de implantá-lo sobre os servidores
Ghazanfar Mir

1
Isso funciona ... Mas há alguma conseqüência / desvantagem em usar isso? Muitos estão sugerindo a configuração de host virtual ou a cópia manual de arquivos, etc. Isso também funciona na produção?
Bogz

1
@GabLeRoux <Files "log.txt">Order Allow,DenyDeny from all</Files>resolve o problema que você solucionou. É seguro agora ou tem mais riscos?
Butterfly

1
@Butterflyit depende da configuração do servidor. O acima irá bloquear apenas log.txt. Apenas certifique-se de bloquear dados confidenciais do público. Se você usa o Laravel e lê a documentação cuidadosamente , sua raiz da web será parecida project/public. Dê uma olhada nesta discussão sobre stackoverflow . Configure seu servidor da web e tente https://example.com/.envpor precaução. Se você vir suas senhas, considere tudo comprometido e altere todas as senhas.
GabLeRoux

126

Resolvi o problema usando 2 respostas:

  1. Renomeando server.php para index.php (sem modificações)
  2. Copie o arquivo .htaccess da pasta pública para a pasta raiz (como o rimon.ekjon disse abaixo)
  3. Alterando .htaccess um pouco da seguinte maneira para estática:

    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]

    Se houver outros arquivos estáticos necessários, adicione a extensão à lista declarada anterior


1
Olá @KA_lin. Como impedir que alguém veja .env como localhost / oap / .env #
Fokwa Best

8
Hmmm ... tenteRewriteRule ^.env - [F,L,NC]
ka_lin

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

Muito obrigado @ka_lin, existe alguma maneira de remover o acesso através de / public /? como www.yoursite.com funciona, mas www.yoursite.com/public também funciona, é possível remover o último?
adaba 23/08/16

8
Ele está trabalhando, mas css, js e imagens não estão a carregar
Chetan Khandla

93

No Laravel 5.5, crie o arquivo .htacess no diretório raiz e coloque o seguinte código: - Link de referência

<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
a melhor resposta! o único trabalhou no meu exemplo, ele deve ter definitivamente mais os votos
FiliusBonacci

Obrigado, isso é trabalho para mim. Mas quero saber se há algum problema de segurança ou não.
rahul singh Chauhan

@rahulsinghChauhan meu prazer. Caro eu não sei sobre questões de segurança, mas deve ser seguro.
Raham

2
O que essa regra RewriteRule ^ ^$1 [N] faz?
precisa saber é

Este é o único funcionou para mim ... muito obrigado
Arshad Ameen

84

NÃO!

VOCÊ REALMENTE NÃO DEVE renomear server.phpna pasta raiz do Laravel index.php e copiar o .htaccessarquivo do /publicdiretório para a pasta raiz do Laravel !!!

Dessa forma, todos podem acessar alguns de seus arquivos ( .envpor exemplo). Tente você mesmo. Você não quer isso!


FAZ

Em vez disso, você deve criar um .htaccessarquivo na sua raiz assim:

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(.*)$ /public/$1 [L,QSA]

Isso reescreverá silenciosamente todos os seus URIs de base na /publicpasta. Mesmo todos os cabeçalhos , por exemplo, o cabeçalho de autorização HTTP e todos os parâmetros opcionais de URI também serão silenciosamente transmitidos para a /publicpasta.

Isso é tudo

Observe ao configurar um projeto Laravel com o Docker: você não precisará fazer isso.


2
Está funcionando bem na produção, mas não está funcionando localmente, alguma sugestão?
Haritsinh Gohil 22/07/19

2
Isso está funcionando perfeitamente! local e servidor obrigado pela ajuda de segurança!
Ghanshyam Nakiya

1
Olá, @DerkJanSpeelman Estou tentando fazer upload de meus arquivos laravel dentro de uma subpasta da minha hospedagem, como: (exemplo.com/projects/laravel/blog) nesse caso, os visitantes precisam visitar example.com/projects/laravel/blog/ public, para que eu coloque um arquivo .htaccess com o seu código na raiz da pasta do blog e deseje que ele seja redirecionado para a pasta pública. Mas não está funcionando. Aqui está o erro: O URL solicitado / público / não foi encontrado neste servidor. Como posso resolver isso ?
Shovon Das 21/08/19

1
Esta resposta é subestimada. Votado para Negrito e destacado Não. Está funcionando absolutamente bem.
Varun Ved

2
A resposta perfeita
alnassre 30/12/19

43

Maneira fácil de remover o público do laravel 5 url. Você só precisa cortar index.php e .htaccess do diretório público e colá-lo no diretório raiz, isso é tudo e substituir duas linhas no index.php como

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

Nota : O método acima é apenas para iniciantes, pois eles podem estar enfrentando problemas na configuração do host virtual e A melhor solução é configurar o host virtual na máquina local e apontá-lo para o diretório público do projeto.


1
Depois disso css não carregar, bcoz todos css estão em público e o público é removido url
Mr. Tomar

1
Você pode colocar "public /" antes dos arquivos js ou css durante o carregamento, por exemplo, Html :: script ("public / js / ....."); --Mas a melhor solução seria o host virtual ...
Muhammad Sadiq

39

@ rimon.ekjon disse:

Renomeie o server.php na pasta raiz do Laravel para index.php e copie o arquivo .htaccess do diretório / public para a pasta raiz do Laravel. -- É isso aí !! :)

Isso está funcionando para mim. Mas todos os arquivos de recursos no diretório / public não conseguiram encontrar e os URLs de solicitação não funcionaram, porque usei o auxiliar asset ()

Alterei a função /Illuminate/Foundation/helpers.php/asset () da seguinte maneira:

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

Agora tudo funciona :)

Obrigado @ rimon.ekjon e todos vocês.


3
Essa não é uma boa maneira de resolver esse problema, pois você está tentando atualizar no diretório de fornecedores, o que não é uma boa prática.
precisa saber é o seguinte

1
você só precisa adicionar RewriteRule ^(.*)$ public/$1 [L]no seu arquivo .htaccess que você copiou do diretório público removendo esta linhaRewriteRule ^(.*)/$ /$1 [L,R=301]
Shadman

29

Basta criar o arquivo .htaccess na raiz e adicionar essas linhas a ele

<IfModule mod_rewrite.c>
    RewriteEngine On

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

É isso aí!

O código acima funciona na pasta raiz public_html. Dito isto, seu arquivo laravel principal deve estar dentro da pasta public_html, se o diretório parecer public_html / laravelapp / public e se você colocar o código acima dentro de laravelapp, ele não funcionará. Portanto, você deve copiar todos os seus arquivos principais em public_html e colocar o arquivo .htaccess lá.

Se você deseja manter o código em um subdiretório, é possível criar um subdomínio, pois esse código também funcionará para isso.


Respondi abaixo antes de ler sua resposta e esta deve ser a resposta aceita. Nenhuma mudança de arquivo: apenas uma regra simples e inteligente.
Brigo

@Raham, qual é o seu URL atual?
Abhinav Saraswat

2
Só quero adicionar uma breve descrição sobre o trabalho deste cavalheiro. O código acima funciona na pasta root public_html (eu também tive problemas). Tendo dito que o seu arquivo laravel principal deve estar dentro da pasta public_html, cometi um erro que meu diretório parecia public_html / laravelapp / public se você colocar o código acima em laravelapp, ele não funcionará. Portanto, você deve copiar todos os seus arquivos principais em public_html e colocar o arquivo .htaccess lá. Referenciando a hospedagem CentOS e Cpanel para laravel.
Deepesh Thapa

Quais são os defeitos de usar esse método?
Script47

1
Funcionou como um encanto para mim, eu tinha apenas o webshost do cPanel e não podia alterar o RootDirectory for Apache. Obrigado ! mais simples e seguro. Isso não permitirá que você veja o conteúdo da sua pasta raiz
Vincent Decaux

27

Crie um .htaccessarquivo no diretório raiz e coloque o código como abaixo.

<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
Eu realmente recomendo esta solução.
TheLastCodeBender

1
Eu também recomendo esta solução
iglesiasd

Muito obrigado. Isso é perfeito (y)
Prappo Islam Prince

3
está funcionando bem, mas ainda assim o arquivo .env pode ser acessado diretamente pelo URL.
Manoj Singh

é uma solução segura?
Sr. PHP Programmer Team Lead

23

1) Não encontrei um método de trabalho para mover o diretório público em L5 . Embora você possa modificar algumas coisas no bootstrap index.php, parece que várias funções auxiliares se baseiam na suposição de que o diretório público esteja lá. Honestamente, você realmente não deveria estar movendo o diretório público.

2) Se você estiver usando o MAMP , deverá criar novos vhosts para cada projeto, cada um servindo o diretório público do projeto. Depois de criado, você acessa cada projeto pelo nome do servidor definido, assim:

http://project1.dev
http://project2.dev

15

É possível remover o URL público no laravel5. Siga esses passos:

copie todos os arquivos do público e cole no diretório raiz

o index.phparquivo da etapa 2.open substitua por

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

E remova todo o cache e cookies.


Oi, Eu tentei o seu método, executei as etapas acima, mas mostra os seguintes erros: Aviso: require_once (D: \ Projects \ laravel / public / index.php): falha ao abrir o fluxo: nenhum arquivo ou diretório em D: \ Projects \ laravel \ server.php na linha 21 Erro fatal: require_once (): falha na abertura necessária 'D: \ Projects \ laravel / public / index.php' (include_path = '.; C: \ xampp \ php \ PEAR' ) em D: \ Projects \ laravel \ server.php na linha 21
Ali Shahzad

Esta não é uma resposta perfeita, é uma maneira muito insegura.
Rohit

11

Digamos que você colocou todos os outros arquivos e diretórios em uma pasta chamada 'locale'.

insira a descrição da imagem aqui

Vá para index.php e encontre estas duas linhas:

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

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

e altere-os para isso:

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

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

11

Aqui está a melhor e mais curta solução que funciona para mim a partir de maio de 2018 para o Laravel 5.5

  1. basta cortar seu .htaccessarquivo do diretório / public para o diretório raiz e substituí-lo pelo conteúdo a seguir:

    <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. Apenas salve o .htaccessarquivo e isso é tudo.

  3. Renomeie seu server.phparquivo para index.php. isso é tudo divirta-se!


9

MELHOR Abordagem: não recomendarei remover o público, on local computer create a virtual host point to public directorye sim on remote hosting change public to public_html and point your domain to this directory. Razão, todo o seu código de laravel será seguro porque está no seu diretório público :)

MÉTODO 1:

Eu só mudar o nome server.phppara index.phpe ele funciona

MÉTODO 2:

Este trabalho bem para toda a versão laravel ...

Aqui está minha estrutura de diretório,

/laravel/
... app
... bootstrap
... public
... etc

Siga estas etapas fáceis

  1. mova todos os arquivos do diretório público para root / laravel /
  2. agora, não há necessidade de diretório público, portanto, opcionalmente, você pode removê-lo agora
  3. agora abra o index.php e faça as seguintes substituições

requer DIR . '/ .. / bootstrap / autoload.php';

para

requer DIR . '/ bootstrap / autoload.php';

e

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

para

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

  1. agora abra o bootstrap / paths.php e altere o caminho do diretório público:

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

para

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

e é isso, agora tente http: // localhost / laravel /


Está tudo bem para tudo. mas o comando artisan não está funcionando, apenas mostra "Não foi possível abrir o arquivo de entrada: artisan". Existe alguma sugestão?
Kabir Hossain

Este método funcionou, se você estiver bem em expor suas credenciais de banco de dados aos usuários. localhost / laravel / .env
MasoodUrRehman /

8

4 melhores maneiras de remover o público do URL.

Se você usou outro truque para remover o público da URL, altere o nome de server.php para index.php e altere o caminho do arquivo principal. Claramente, não faça isso. Então, por que o Laravel não está dando a solução dessa maneira, porque não é uma maneira adequada de fazer isso?

1) Remova o público do URL usando o htaccess no Laravel

Ao adicionar um arquivo .htaccess à raiz, você pode acessar o site sem necessidade de

<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) Remova o público criando um host virtual em seu local

Estou dando uma demonstração aqui para o sistema operacional Windows. Mas tentarei definir um passo para que qualquer um possa segui-lo facilmente. Você também pode pesquisar no google o mesmo para o sistema operacional específico.

Etapa 1: Vá para C: \ Windows \ system32 \ drivers \ etc \ abra o arquivo "hosts" no modo Administrador.

Etapa 2: adicione o seguinte código a ele. Aqui, estou fornecendo uma demonstração do nome do domínio project.local, você pode especificar o que quiser. Apenas faça constante em todos os lugares.

127.0.0.1  projectname.local

Etapa 3: Agora vá para, C:\xampp\apache\conf\extrapara usuários do xampp e para o usuário do wamp "C:\wamp\bin\apache\Apache2.4.4\conf\extra"e abra o "httpd-vhosts.conf"arquivo. Agora adicione o seguinte código nele.

Notas: Altere a raiz do documento conforme seu projeto e adicione o nome de domínio conforme definido no arquivo "hosts".

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

Etapa 4: Por último, mas a etapa importante é reiniciar o seu Xampp ou Wamp e acessar o URL como se fosse o http://projectname.localseu Laravel responderá sem URL público.


3) Remova o público executando o comando no Laravel

Se você trabalha no local, não precisa fazer nada, basta executar o seguinte comando no terminal ou na ferramenta de linha de comando. Depois disso, você pode acessar o site pela URL fornecida pela linha de comando.

   > php artisan serve

Se você estiver disposto a executar seu projeto em um IP específico, precisará executar o seguinte comando. Se você estiver trabalhando na LAN, se quiser permitir que outras pessoas acessem seu site localmente, basta verificar seu endereço IP usando a linha de comando executando "ipconfig" depois de obter seu endereço IP seguindo o comando.

> php artisan serve --host=192.168.0.177

Se você estiver disposto a executar seu projeto em um IP específico com uma porta específica, precisará do seguinte comando.

> php artisan serve --host=192.168.0.177 --port=77

4) Remova o público no servidor hospedado ou no cpanel

insira a descrição da imagem aqui

Após a conclusão do projeto, você precisa hospedá-lo no servidor, basta definir a raiz do documento no seu domínio para a pasta pública. Verifique a captura de tela abaixo.

Conforme a captura de tela, se você não tiver nenhuma pasta de projeto no public_html, basta definir a raiz do seu documento "public_html/public".

Referência retirada daqui


1
Todas as quatro maneiras são boas, mas resolvi meu problema usando a primeira solução.
Manisha

7

Gostaria de adicionar ao @Humble Learner e observar que o local adequado para "corrigir" o caminho da URL dos ativos é /Illuminate/Routing/UrlGenerator.php/asset ().

Atualize o método para corresponder:

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, '/');
}

Isso corrigirá scripts, estilos e caminhos de imagem. Qualquer coisa para caminhos de ativos.


6

Para que o usuário do XAMPP remova o público da url sem tocar no sistema de arquivos padrão do laravel, configure um host virtual para o seu aplicativo fazer isso, apenas siga estas etapas

  1. Abra o aplicativo do painel de controle XAMPP e pare o Apache. Esteja ciente de que máquinas Windows atrasadas podem executá-lo como um serviço; portanto, marque a caixa à esquerda do módulo Apache.

  2. Navegue para C:/xampp/apache/conf/extraou onde seus arquivos XAMPP estiverem localizados.

  3. Abra o arquivo chamado httpd-vhosts.conf com um editor de texto.

  4. Na linha 19, encontre # NameVirtualHost *:80e remova o comentário ou remova o hash.

  5. Na parte inferior do arquivo, cole o seguinte código:

<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. Agora você pode copiar e colar o código acima abaixo para adicionar seus diretórios de Host Virtual. Por exemplo, estou trabalhando em um site chamado Eatery Engine, para que o seguinte trecho permita que eu trabalhe com subdomínios na minha instalação local:
<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. Em seguida, vá para o arquivo host do Windows para editar seus HOSTS. o arquivo estará localizado em C:/Windows/System32/drivers/etc/hosts, onde hosts é o arquivo. Abra-o com o bloco de notas.
  2. Procure #localhost resolução de nomes é tratada no próprio DNS.

127.0.0.1 localhost

A resolução de nomes de host local é tratada no próprio 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. Reinicie o Apache e teste tudo.

O artigo original pode ser encontrado aqui


5

Sempre há um motivo para ter uma pasta pública na configuração do Laravel, todos os materiais relacionados ao público devem estar presentes dentro da pasta pública,

Não aponte seu endereço IP / domínio para a pasta raiz do Laravel, mas aponte para a pasta pública. Não é seguro apontar o IP do servidor para a pasta raiz., Porque, a menos que você escreva restrições .htaccess, é possível acessar facilmente os outros arquivos.,

Basta escrever a condição de reescrita no .htaccessarquivo e instalar o módulo de reescrita e ativar o módulo de reescrita, o problema que adiciona público à rota será resolvido.


3

Eu sei que existem muitas soluções para esse problema. A melhor e mais fácil solução é adicionar o arquivo .htaccess no diretório raiz .

Tentei as respostas que fornecemos para esse problema, mas enfrentei alguns problemas com o auth: api guard no Laravel.

Aqui está a solução atualizada:

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

Crie o arquivo .htaccess no diretório raiz e adicione esse código. E tudo dá certo


2

Laravel 5.5

Depois de instalar o Laravel pela primeira vez, enfrentei o renomado "problema de pasta pública" e encontrei esta solução que, na minha opinião pessoal , é "mais limpa" que as outras que encontrei na Web.


Conquistas

  • Não tem publicpalavra no URI
  • Proteger o .envarquivo contra pessoas curiosas

Tudo pode ser feito apenas editando o .htaccessuso mod_rewritee quatro regras simples.


Passos

  1. Mova o .htaccessarquivo para public/.htaccessdentro da raiz principal
  2. Edite-o como abaixo

Comentei tudo, por isso deve ficar claro (espero) também para aqueles que nunca usaram mod_rewrite(não que eu seja um especialista, pelo contrário). Além disso, para entender as regras, deve ficar claro que, no Laravel, se Bill se conectar https://example.com, https://example.com/index.phpestá carregado. Este arquivo contém apenas o comando header("refresh: 5; https://example.com/public/"), que envia a solicitação para https://example.com/public/index.php. Este segundo index.phpé responsável por carregar o controlador e outras coisas.

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

A regra a seguir (originalmente em public/.htaccess) pode ser excluída. A mesma regra, de fato, é explicada de maneira mais detalhada nas duas últimas regras.

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

EDIT: eu perdi Abhinav Saraswat solução 's e sua resposta deve ser o único aceito. Apenas uma regra simples e clara que redireciona todo o tráfego para a pasta pública sem modificar nenhum arquivo.


2

Em primeiro lugar você pode usar estas etapas

Para o Laravel 5:

1. Renomeie server.php na pasta raiz do Laravel para index.php

2. Copie o arquivo .htaccess do diretório / public para a pasta raiz do Laravel.

fonte: https://stackoverflow.com/a/28735930

Depois de seguir estas etapas, você precisará alterar todo o caminho css e script, mas isso será cansativo.

Proposta de solução : basta fazer pequenas alterações na helpers::assetfunção.

Para isso :

  1. abrir vendor\laravel\framework\src\Illuminate\Foundation\helpers.php

  2. ir para a linha 130

  3. escreva em "public/".$pathvez de $path,

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

2
Regra número 1: nunca edite um arquivo principal. Mesmo que pareça fácil e agradável agora, você pagará mais tarde.
Janaka Dombawela #

@JanakaDombawela eu não penso assim porque:
Ferhat KOÇER

@JanakaDombawela Eu não penso assim porque: Senerio 1: se um desenvolvedor é experiente: código-fonte aberto é para este trabalho Senerio 2: se um desenvolvedor é júnior, o desenvolvedor deve editar o código-fonte para obter experiência
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>

Ative o módulo mod_rewrite com

sudo a2enmod rewrite

e reinicie o apache

sudo service apache2 restart

Para usar mod_rewrite nos arquivos .htaccess (que é um caso de uso muito comum), edite o VirtualHost padrão com

sudo nano /etc/apache2/sites-available/000-default.conf

Abaixo de "DocumentRoot / var / www / html", adicione as seguintes linhas:

<Directory "/var/www/html">
AllowOverride All
</Directory>

Reinicie o servidor novamente:

sudo service apache2 restart

1

Eu li alguns artigos antes e está funcionando bem, mas realmente não sei se é seguro ou não

    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. 

Edite o index.php

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

para

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

1

Mesmo que eu não recomende colocar o Laravel na pasta raiz, há alguns casos em que não pode ser evitado; nesses casos, os métodos acima não funcionam para ativos, por isso fiz uma correção rápida alterando o htaccess: depois de copiar server.php para index.php, edite o arquivo .htaccess da seguinte maneira:

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

Esta foi uma solução rápida que eu tive que fazer para que todos sejam bem-vindos para atualizá-la.


1

O problema é que se você digitar / public e ele ainda estará disponível no URL, criei uma correção que deve ser colocada no 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;
   }}

essa paz de código removerá o público do URL e fornecerá um 404 e depois redirecionará para o URL sem o público


0

Outro método que eu uso é criar um link simbólico (no Linux, não sei sobre o Win) usando o comando ln em htdocs ou www, ou seja, ln projectname/public project o site é acessível por meio de host / projeto local


0

Você pode remover a palavra-chave pública do URL usando vários métodos.

1) Se você estiver usando hospedagem dedicada e tiver acesso root, poderá remover a palavra-chave pública da url usando o Host Virtual. Você deve fornecer o caminho do DocumentRoot com public. Portanto, isso iniciará o índice do diretório público e o removerá do 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) Se você não tem acesso root da sua hospedagem, você deve gerar um novo arquivo .htaccess no diretório raiz e colocar o código como abaixo

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

Você pode obter mais referência aqui.


0

Crie o arquivo .htaccess no diretório raiz e coloque o código como abaixo.

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

Crie o arquivo .htaccess no diretório / public e coloque o código como abaixo.

<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

Encontrei a solução mais funcional para esse problema.

Basta editar o seu .htaccessna pasta raiz e escrever o código a seguir. Nada mais é necessário

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

Eu tentei alguma solução aqui e encontrei htaccess que funciona para o laravel 5.2, como este:

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]

quando você tiver outro arquivo ou pasta proibido, basta adicionar

RewriteRule ^your_file - [F,L,NC]

-1

Você não precisa fazer muito, basta criar um arquivo .htaccess no diretório raiz e colar / salvar o abaixo;

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

Isso me redirecionamentos para público / público /
zanderwar

@zanderwar, por favor, qual é a versão do Laravel? Além disso, espero que você não tenha seu projeto em um subdiretório do diretório principal?
Victor Ifeanyi Ejiogu 25/07/19

O projeto é raiz, a versão é 5.6. * - No entanto, ele está em um subdomínio, em hospedagem compartilhada; Infelizmente, este cPanel forças de instalação subdomínios ter uma pasta dentro de public_html
zanderwar
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.