Meu objetivo é atender solicitações de dispositivos móveis em uma URL diferente (um local específico) do que a genérica usada na versão desktop do meu site.
Também preciso servir arquivos de uma raiz de documento diferente, que deve ser vista como o caminho base (não quero que minha localização faça parte da estrutura do diretório).
Tenho esta configuração (extrato):
location / {
if ($http_user_agent ~* '(iPhone|iPod|iPad|Android|BlackBerry|webOS|Windows Phone)') {
rewrite ^ /mobile/ permanent;
}
index index.html index.htm;
}
location /mobile/ {
root /my/mobile/website; # new document root
rewrite ^/mobile(.*)$ $1 break; # strip /mobile prefix from the path
# try_files $uri $uri/ /index.html; # I tried this (don't know exactly what this should do), but it doesn't work anyway
index index.html index.htm;
}
Isso não funciona e está causando um loop de redirecionamento.
Parece que as solicitações para www.mydomain.com/mobile/
não são correspondidas na location /mobile/
seção, mas ainda caem em location /
, causando um loop de redirecionamento 301.
Se eu deixar a rewrite ^/mobile(.*)$ $1 break;
diretiva de lado, ela funciona. Eu obtenho uma página index.html que coloquei no /my/mobile/website/mobile
diretório para teste, mas não é de lá que meus arquivos devem ser servidos.
O que estou perdendo?
Imagino que o problema seja
index
./mobile/
.rewrite...break
altera a URL,/
mas permanece dentro do mesmolocation
bloco para continuar processando a solicitação.index
diretiva altera a URL e/index.html
então procura uma correspondêncialocation
que vai para o outrolocation
bloco, resultando em um loop de redirecionamento.Você pode considerar usar
alias
para substituir ambosroot
erewrite...break
.Por exemplo:
Observe que as instruções
location
andalias
devem terminar com/
ou nenhuma delas deve terminar com/
para uma operação de alias correta.