rewrite regras para o apache 2 para usar com js angular

Obviamente, há um monte de discussões e respostas de reescrita de mods em toda a web. No entanto, estou tendo dificuldade em entendê-los. Então pensei em perguntar aqui.

Eu estou pedindo para rewrite as regras para fazer o que Andy Joslin explicou nos comentários aqui: https://stackoverflow.com/a/11100438

Esta é a minha estrutura atual de diretórios na raiz de example.com

  • aplicativo/
  • app / index.html (a “raiz” do aplicativo js angular)
  • api (Este será um aplicativo do symfony 2 que é usado para a ‘api’. Eu enviarei pedidos de ajax para e daqui de forma angular.)

Desejo redirect todas as solicitações para app / index.html, exceto para solicitações para / api.

Por exemplo:

http://example.com/categories/electronics/ipod seria como acessar http://example.com/app/index.html/categories/electronics/ipod

Eu gostaria que a parte app / index.html fosse escondida no entanto.

Então, haveria uma exceção para solicitações de http://example.com/api, pois precisarei fazer solicitações de ajax para esses caminhos de URL.

Obrigado por toda e qualquer ajuda / orientação.

Aqui está algo para você ir (coloque isso dentro do seu arquivo /.htaccess):

Options +FollowSymLinks IndexIgnore */* RewriteEngine on # if a directory or a file exists, use it directly RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteCond %{REQUEST_URI} !/api # otherwise forward it to index.html RewriteRule ^.*$ - [NC,L] RewriteRule ^app/. /app/index.html [NC,L] 

A resposta aceita para essa pergunta está desatualizada. Agora você pode usar a diretiva FallbackResource no seu arquivo conf com o Apache 2.2.16+.

 FallbackResource /app/index.html 

Se você quiser que a diretiva FallbackResource ignore as rotas “/ api”:

  FallbackResource disabled  

O problema com esta resposta é que você ainda quer 404s para o arquivo não encontrado. Dependendo de como uma pessoa está construindo seu aplicativo front-end, é muito comum que as pessoas tenham o css ou outros arquivos retornando 404, especialmente se estiverem criando aplicativos dynamics maiores ou terceirizando o trabalho de front-end. Além disso, as rotas angulares geralmente não estão relacionadas a nada no sistema de arquivos. O acima pode funcionar se você reduzi-lo a um único diretório. Por exemplo, usarei frequentemente um prefixo comum para todas as rotas angulares que não estejam relacionadas ao layout do sistema de arquivos (/ ajs /). Se você puder fazer

  FallbackResource /app/index.html  

Então faria mais sentido, mas isso não parece funcionar para mim. Usar um prefixo comum também torna as regras de backend muito mais simples, não importa o back-end. Por exemplo, você pode configurar um controlador de encaminhamento de servidor simples se não estiver usando um proxy reverso. E faz modelar seu apache rewrite regras simples. Por exemplo:

 RewriteEngine On RewriteRule ^/ajs/(.+)$ /index.html 

Dito isto, eu não vi o método de diretório / fallback antes, então estou interessado em explorá-lo para quando a única reescrita que eu preciso é para o angular para a frente. Obrigado!

Esta é uma ligeira variação e elaboração da excelente resposta de Scott Ferguson. Eu acho mais fácil usar a diretiva que . A diretiva usa um nome de caminho absoluto que pode ser diferente em máquinas diferentes.

Então, digamos que index.html do seu aplicativo Angular esteja em my-app/index.html sob a raiz do documento do seu servidor web. E você deseja acessar o aplicativo usando http://localhost/my-app .

Primeiro de tudo, certifique-se de que sua href base seja “/ my-app /”. Em seguida, no seu arquivo httpd.conf adicione:

  FallbackResource /my-app/index.html  

Isso fará com que o Apache carregue index.html se algum recurso em /my-app/ não puder ser encontrado.

Se você estiver fazendo chamadas de API no mesmo caminho, por exemplo, /my-app/api , provavelmente não aplicará a regra FallbackResource para essas chamadas. Então adicione:

  FallbackResource disabled