9
respostas

Tirar /public da URI ao subir para o servidor

Boa noite. Para tirar o /plublic da URI, renomeei o arquivo server.php no root do meu projeto para "index.php" e copiei o arquivo ".htaccess" da pasta public para a root. Deu certo... os links estão todos funcionando porém o CSS não é carregado. No console recebi esta mensagem de erro: Resource interpreted as Stylesheet but transferred with MIME type text/html:... Oque devo fazer?

9 respostas

Tentei algumas soluções mas nada resolveu. =/

Olá Rodrigo, Normalmente esse não é o caminho para remover o public.

Normalmente em projetos laravel o public é a pasta que é servida na web, todas as demais pastas ficam um diretório acima do diretório root web.

Isso é feito para evitar que arquivos de configuração como .env possam ser baixados do servidor.

Uma forma de remover o public sem alterar a estrutura do laravel é usar um virtual host no apache, com ele você pode definir um endereço no apache e uma pasta para onde ele pode apontar.

No arquivo de configuração do apache httpd-vhosts.conf (ele normalmente fica na pasta extra do apache) que controla o virtual host você deve adicionar o seguinte código:

Substitua ENDERECODARAIZDOLARAVEL pelo endereço do laravel no seu computador.

Substitua DOMINIOQUEDESEJAUSAR pelo domunio local que deseja usar.

<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "ENDERECODARAIZDOLARAVEL/public"
    DirectoryIndex index.php
    ServerName DOMINIOQUEDESEJAUSAR
    ServerAlias www.DOMINIOQUEDESEJAUSAR
    ErrorLog "/private/var/log/apache2/laravel-dev-error_log"
    CustomLog "/private/var/log/apache2/laravel.dev-access_log" common

    <Directory "/Users/username/sites/ldemo/public">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride All
        Order allow, deny
        Allow from all
    </Directory>

</VirtualHost>

Feito isso você deve adicionar no hosts do seu computador:

Substitua o DOMINIOQUEDESEJAUSAR pelo dominio apontado no virtual host.

127.0.0.1             www.DOMINIOQUEDESEJAUSAR

Após fazer estas etapas reinicie o apache para que as mudanças tomem efeito.

DICA: Utilizando este método o laravel não precisa estar na pasta www ou htdocs do seu servidor web, ela pode estar em qualquer pasta do computador.

Bom dia. Obrigado pela resposta... mas não sei se entendi ou se consegui explicar direito oque eu queria. =) Subi o meu projeto para meu servidor web no endereço mardefotos.vixconsulting.com.br Se jogar essa URI, vai entrar no sistema, porém sem o CSS e com a mensagem de erro ( Resource interpreted as Stylesheet but transferred with MIME type text/html ) no console. Se eu entrar com a URI mardefotos.vixconsulting.com.br/public ele vai entrar normal, porém precisarei alterar todas as rotas que criei para incluir o /public. Oque eu queria era não precisar adicionar o /public a todos os meus links. Como eu falei, eu fiz as alterações no arquivo server.php no root e copiei o htacces que estava na /public para o root. Complicado né? rs

Olá Rodrigo, Neste caso o ideal como eu falei seria subir toda a sua estrutura de diretórios um nível acima, mantendo o conteúdo da pasta public no htdocs ou www do seu webhost.

Suponhando que no seu host vix consulting você tenha a seguinte estrutura de pastas

root/public ou root/htdocs ou root/www.

Você deve colocar as pastas do laravel na pasta root (que pode ser a pasta que abre para você quando você abre o ssh ou ftp ou uma pasta acima se ele já abre dentro da pasta que fica exposta para web), e o conteúdo da pasta public você deve colocar nesta pasta que fica exposta, não há necessidade de usar o htaccess neste caso e os arquivos de sua aplicação não ficam expostos para o mundo.

Eu acredito que parte do problema possa estar associada ao seu htaccess e na forma como ele direciona as requisições para o index que eu acredito estar definindo um cabeçalho em html, visto que além do seu css os seus arquivos javascript também estão com o mesmo mime type no header enviado pelo http.

Mas não posso fazer isso porque dentro do meu host, tenho vários subdominios. A estrutura está assim: / public_html mardefotos outroSubDominio outroSubdominio Dentro da mar de fotos tem toda a estrutura do Laravel, incluindo a pasta Public. Se eu deixar o conteudo da public dentro da mardefotos e o restante um nível acima, vai ficar a maior bagunça por causa dos outros subdominios. =/

Vixi... ele tirou os tabs e quebras de linhas que fiz... mas acho que deu para entender a estrutura atual. =)

Olá Rodrigo, Neste caso você talvez tenha que alterar a estrutura do htaccess para que requisições a ativos (css, js e img) não sejam passadas pelo index.php, você consegue postar ele aqui?

Claro. A estrutura dela é:

/

public_html

mardefotos arquivos laravel referentes à uri mardefotos.vixconsulting.com.br

prondog arquivos laravel referentes à uri prondog.vixconsulting.com.br

petshop arquivos laravel referentes à uri petshop.vixconsulting.com.br

Seria isso mesmo que você precisa?

Desde ja, agradeço.

Olá Rodrigo, Peço desculpa pela demora na resposta.

Quando recebi o e-mail de notificação ele não continha a parte de baixo.

Um arquivo htaccess normalmente deve ter uma regra como:

RewriteRule ^(.*)$ http://localhost/public/$1 [R=301,L]

Essa regra tem alguns pedaços, por exemplo o ^(.*)$ é o padrão, o que bater com este padrão é então enviado como $1 para o endereço do lado, o ( e ) indicam grupos de captura, o ^ quer dizer no inicio do texto a ser analisado e o $quer dizer o fim do texto a ser analisado.

Este padrão pode ser ajustado para não pegar css, js ou Imagens.

Por exemplo o:

RewriteCond %{REQUEST_URI} !(\.css|\.js|\.png|\.jpg|\.gif)$ [NC]

Isso adiciona uma condição (identificado pelo RewriteCond que tem um padrão %{REQUEST_URI} representa a URL testada e o !(\.css|\.js|\.png|\.jpg|\.gif)$ que faz parte do padrão do %{REQ... é um negative look ahead que quer dizer, ache toda a URL (REQUEST_URL) que não tenha no fim as extensões .css, .js, .png, .jpg, .gif, o não tenha no fim é identificado porque o $ é o fim do texto e o . é um ponto escapado porque apenas . é um wildcard (curinga que representa qualquer caracter enquanto um . representa um ponto, assim como um \n representa uma quebra de linha).

O [NC] significa que não deve diferenciar maiúsculas de minúsculas, enquanto o [R=301] quer dizer redireciona (código 301, existem vários, como 302, 303, etc.) o L no 300 quer dizer que é a última regra, ou seja ignore as condições abaixo.

você deve reescrever seu htaccess para evitar que ele processe seu CSS, Imagens e JS evitando que ele os redirecione ou adicione um cabeçalho nestas requisições.