O conteúdo expirado cria 404s com o Nginx?

2

Eu tenho um host virtual que inclui o seguinte location block:

server {
  listen      80;
  server_name ~^(?<username>[^.]+)\.project*/\.client\.com$; 
  root        /home/$username/project/app/webroot;
  index       index.php; 

  access_log /var/log/nginx/project.sandbox.access.log;
  error_log  /var/log/nginx/project.sandbox.error.log;

  location / {
    try_files $uri $uri/ /index.php?url=$uri;
  } 

  location ~ \.php$ {
    include /etc/nginx/includes/php;
  }

  location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    expires max;
    log_not_found off;
  }
  include /etc/nginx/includes/ignore;
}

Eu nunca tive problemas antes, mas acabei de adicionar um recurso que permite que os usuários façam upload de & armazenar arquivos. Se o usuário fizer o upload de arquivos pdf, txt, etc., tudo estará bem e eu posso carregar o upload bem por meio de seu URL. Imagens, por outro lado, não tanto. 404s em todos os lugares.

Eu reduzi isso a esse bloco, mas não o entendo. Outros recursos de imagem são carregados corretamente. A única diferença, que pode fazer toda a diferença, é que os recursos enviados não são carregados na raiz da Web, conforme definido pela diretiva server do bloco root . Os uploads são armazenados em /opt/www/app/plugins/... . Existe alguma razão que deveria importar? Meu front controller lida com o roteamento dos recursos enviados.

Gostaria de armazenar em cache / expirar o conteúdo, mas preciso corrigir os 404s primeiro.

    
por Rob Wilkerson 08.03.2013 / 14:42

1 resposta

2

Seu bloco .(js|css|png|jpg|jpeg|gif|ico) location captura solicitações de recursos carregados que terminam com essas extensões de arquivo. Como o nginx só executa um único bloco de localização em cada nível, seu script PHP não é executado para essas solicitações. O nginx tenta veicular o arquivo diretamente do disco, mas não consegue encontrar o recurso enviado.

Você precisa tornar essa correspondência de blocos de local mais restrita, para que ela não corresponda aos recursos enviados. Por exemplo:

location ~* ^/static/.*\.(js|css|png|jpg|jpeg|gif|ico)$

Editar : quando digo "nível", quero dizer nível de aninhamento. Por exemplo:

location / {
    location /foo {}
}

location /bar {}

location /baz {
    location /baz/quaz {}
    location ~ \.php$ {}
}

Os blocos de localização / , /bar e /baz estão no nível 1. Os blocos de localização /foo , /baz/quaz e \.php$ estão no nível 2, porque estão aninhados dentro de um nível 1 bloco de localização. Digamos que a solicitação seja para /baz/quaz/index.php . O nginx selecionará o bloco de localização de nível 1 mais específico, neste caso /baz . Nenhum outro bloco de localização de nível 1 será processado, portanto, o bloco / não terá efeito para essa solicitação. Se houver blocos de localização de nível 2, fará o mesmo, neste caso, escolhendo \.php$ e ignorando /baz/quaz .

    
por 09.03.2013 / 00:00

Tags