A entrega de arquivos estáticos só funciona se raiz for uma subpasta em público

2

Estou tentando fornecer arquivos de cache estático usando o nginx. Existem arquivos index.html no diretório rails_root/public/cache . Eu tentei a seguinte configuração primeiro, o que não funciona:

root <%= current_path %>/public;
try_files /cache$uri/index.html /cache$uri.html @rails;

Isto dá erro:

[error] 4056#0: *13503414 directory index of "(...)current/public/" is forbidden, request: "GET / HTTP/1.1"

Eu então tentei

root <%= current_path %>/public/cache;
try_files $uri/index.html $uri.html @rails;

E, para minha surpresa, isso funciona. Por que é que eu posso fazer o último não o primeiro (desde que apontam para o mesmo local)

Permissões do sistema de arquivos

As permissões das pastas são:

775 public
  755 cache
    644 index.html

O Rails fica no diretório ~ do usuário, portanto as pastas e os arquivos pertencem ao usuário good . O usuário de nginx é root para mestre e http para cada processador de trabalho:

89:http      7865  0.1  0.0   8876  2624 ?        S    Jul10   0:51 nginx: worker process                        
112:root     24927  0.0  0.0   8532  1828 ?        Ss   Jun28   0:03 nginx: master process /usr/sbin/nginx -c /etc/nginx/conf/nginx.conf

Meu favicon está em público / é exibido corretamente pelo seguinte:

# asset server
server {
  listen 80;
  server_name assets.<%= server_name %>;
  expires max;
  add_header Cache-Control public;
  charset utf-8;
  root   <%= current_path %>/public;
}

LOG

Para minha configuração de trabalho: o log de acesso mostra:

request:"GET / HTTP/1.1" 200 uri:"/index.html"
request:"GET /assets/gas/468x15_4.gif HTTP/1.1" 200 uri:"/assets/gas/468x15_4.gif"

Se eu adicionar index nonexistent , o mesmo erro do índice de diretório proibido apareceria com o seguinte log de acesso:

request:"GET / HTTP/1.1" 403 uri:"/"

log de erros:

directory index of "RAILS_ROOT/current/public/cache/gas/" is forbidden, client: _IP_, server: example.com, request: "GET / HTTP/1.1", host: "gas.example.com"

UPDATE

Por favor, veja o arquivo de configuração completo . Note que está completo e o exemplo dado acima é um pouco simplificado.

Estou usando o Nginx 1.22

    
por lulalala 06.07.2012 / 04:44

2 respostas

0

O problema está nas diretivas if em location blocks. Estes só foram mostrados nos arquivos de configuração completos (desculpem aqueles que tentaram resolver este problema sem isso). Uma vez que eu mudei para o nível de bloco server , tudo funciona bem.

directory index of *** is forbidden é uma indicação de que nenhuma diretiva de conteúdo está disponível no bloco de localização. Nesse caso, o location é um bloco aninhado location , criado quando a diretiva if é usada em um bloco location .

if diretivas em server nível de bloco não apresentam esse problema. Meu if s pode ser movido e ainda funcionar corretamente, mas não tenho certeza de qual if s não funcionará se movido.

Portanto, neste caso, as permissões do arquivo provavelmente não são tão relevantes.

@Vbart está correto em dizer que se é mal .

    
por 06.08.2012 / 09:19
0

Acho que o índice deve ser processado antes do try_files próximo a NGX_HTTP_ACCESS_PHASE, pois, como o log sugere, você está solicitando diretório.

A maneira correta seria acessar a lista de discussão oficial com essa pergunta.

    
por 17.07.2012 / 13:44