Nginx regra de reescrita “^ / ([a-z0-9] {32}) \. png $” não está funcionando (usado para trabalhar no Apache)

3

Eu tenho essas regras de reescrita (eu tentei as duas sem sucesso):

location ~* "^/([a-z0-9]{32})\.png$" {
  rewrite ^ /index.php?page=log&id=$1 last;
} 

e

location ~* "/(?<hash>[a-z0-9]{32})\.png" {
  rewrite ^ /index.php?page=log&id=$hash;
}

e

location / {
  try_files $uri $uri/ @rewrites;
}

location @rewrites {
  rewrite "^/([a-zA-Z0-9]{32})\.png$" /index.php?page=log&id=$1 last;
  #...
}

Basicamente, quero que a URL http://example.com/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.png passe realmente os parâmetros para o meu script index.php e, no script, eu recebi:

$db->save_hash($_GET['id']);
header('Content-type: image/png');
readfile('images/beacon.png');
break;

Mas o nginx está me dando um "not found", mas outras reescritas funcionam bem. O que dá?

    
por pocesar 15.01.2013 / 13:50

4 respostas

0

De acordo com a documentação do nginx de como funciona a diretiva location :

A location can either be defined by a prefix string, or by a regular expression. ... A search of regular expressions terminates on the first match, and the corresponding configuration is used.

Com base nas informações adicionais da sua própria resposta para essa mesma pergunta, parece que você pretende ter vários locais directivas a aplicar em simultâneo, ao mesmo tempo, o que não é explicitamente permitido de acordo com a documentação inequívoca.

Lembre-se, o nginx é mais rápido e mais limpo por design. Então, não espere as peculiaridades!

    
por 24.01.2013 / 08:55
4

este trabalhou para mim:

    location / { 
    rewrite "/([a-z0-9]{32})\.png" /index.php?page=log&id=$1 break;
    }

Ou se você quiser um local separado:

location ~* "/([a-z0-9]{32})\.png" {
rewrite /(.*) /index.php?page=log&id=$1 last;
}
    
por 16.01.2013 / 16:10
0

Enquanto a resposta de @ unlo parece correta para mim (tentei-me em um virtualhost limpo), vejo mais uma otimização. Ao invés de servir um arquivo estático pelo seu script, você pode querer usar o recurso XSendFile para fazer o nginx servir esses arquivos.

    
por 21.01.2013 / 21:34
0

Mark apontou para que eu comecei a remover todos os arquivos incluídos e resumi:

/etc/nginx/conf.d/h5bp.conf

que contém

# Basic h5bp rules

include /etc/nginx/conf.d/expires.conf;
include /etc/nginx/conf.d/x-ua-compatible.conf;
include /etc/nginx/conf.d/protect-system-files.conf;

o expires.conf obteve

# Expire rules for static content

# No default expire rule. This config mirrors that of apache as outlined in the
# html5-boilerplate .htaccess file. However, nginx applies rules by location,
# the apache rules are defined by type. A concequence of this difference is that
# if you use no file extension in the url and serve html, with apache you get an
# expire time of 0s, with nginx you'd get an expire header of one month in the
# future (if the default expire rule is 1 month). Therefore, do not use a
# default expire rule with nginx unless your site is completely static

# cache.appcache, your document html and data
location ~* \.(?:manifest|appcache|html|xml|json)$ {
  expires -1;
  access_log /var/log/nginx/static.log;
}

# Feed
location ~* \.(?:rss|atom)$ {
  expires 1h;
  add_header Cache-Control "public";
}

# Favicon
location ~* \.ico$ {
  expires 1w;
  access_log off;
  add_header Cache-Control "public";
}

# Media: images, video, audio, HTC
location ~* \.(?:jpg|jpeg|gif|png|ico|gz|svg|svgz|mp4|ogg|ogv|webm)$ {
  expires 1M;
  access_log off;
  add_header Cache-Control "public";
}

# CSS and Javascript
location ~* \.(?:css|js)$ {
  expires 1y;
  access_log off;
  add_header Cache-Control "public";
}

# WebFonts
# If you are NOT using cross-domain-fonts.conf, uncomment the following directive
location ~* \.(ttf|ttc|otf|eot|woff|font.css)$ {
  expires 1M;
  access_log off;
  add_header Cache-Control "public";
}

comentando que expires.conf , então começa a funcionar, como posso corrigir isso?

    
por 23.01.2013 / 22:16