Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Remover o "#" da url em um servidor apache.

Estou com um problema com o a SPA do angular.js, minha url com o angular fica http://localhost:8080/clubs/#/product/club-slug. E eu quero tirar este # desta url. Então eu ativei o $locationProvider.html5Mode(true); no meu angular.config, e <base href="/clubs/"> no meu HTML. Durante a navegação, o # desaparece, mas quando eu tento acessar minha url sem o #, eu caio no erro 404 :/ Então eu estou tentando usar o RewriteRule para adicionar o # quando o usuário não digitar, e não adicionar caso o usuário já tenha colocado na url. Mas não estou conseguindo achar um regEx que faça isso. Essa é a melhor forma de resolver este caso?

Eu ja uso isto no meu RewriteRule do apache:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) $1.php [L]

Obrigado

3 respostas
solução!

Não sei ao certo como configurar isso no apache. Mas o que deve acontecer é o seguinte. Seu servidor deve devolver para qualquer URL a página index.html, inclusive para 404! Esse passo é muito importante. É por isso que não podemos simplesmente pegar uma aplicação SPA e jogar dentro de uma pasta compartilhada do apache.

Se tiver dificuldades, volte como hash. Por exemplo, o Gmail usa o hash até hoje sem problema algum.

Grande Flavio, obrigado pela explicação, consegui achar uma solução para inserir a SPA dentro de uma pasta compartilhada do apache. Tenho um site que não está em SPA angular, mas q dentro desse projeto, existem subprojetos que são pastas dentro dele, e um deles usei o angular para fazer a SPA, no apache eu consigo definir a regra de Rewrite, e o melhor, consigo definir a regra de Rewrite para um caminho específico, então fiz exatamente o que você falou, sempre que solicitar qualquer URL, o servidor devolve a index.html, porém, fiz essa regra sempre que a url começar com o meu diretório desse projeto, ficando da seguinte maneira:

<Directory />
    AllowOverride none
    Require all denied
     RewriteEngine On
     RewriteCond %{REQUEST_FILENAME} !-d
     RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule (.*) $1.php [L]
</Directory>

<Directory ~ "\/angular.*">
    AllowOverride none
    Require all granted

    RewriteEngine On  
      RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
      RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
      RewriteRule ^ - [L]
    RewriteRule ^ /angular/index.php
</Directory>

Com isso, a regra que sempre envia para /angular/index.php é aplicada apenas se a url contem o diretório /angular.

Obrigado pela ajuda! :)

Excelente! Seja estratégia servirá para qualquer framework SPA!