Nginx重写规则“^ /( {32})\。png $”不起作用(用于Apache)

我有这些重写规则(我尝试都没有用):

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

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

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

基本上,我希望URL http://example.com/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.png实际上将parameter passing给我的index.php脚本,并在脚本中得到:

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

但是nginx给了我一个“未find”,但其他重写工作正常。 是什么赋予了?

根据nginx文档的location指令如何工作:

位置可以由前缀string定义,也可以由正则expression式定义。 …正则expression式的search在第一次匹配时终止,并使用相应的configuration。

根据你自己对这个问题的答案的补充信息,似乎你打算在同一时间同时适用几个定位指令,根据明确的文档明确地不允许这样做。

请记住,nginx的devise更快更清洁。 所以,别指望怪癖!

这个为我工作:

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

或者,如果你想分离的位置:

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

虽然@ unlo的答案似乎是正确的(尝试自己在一个干净的虚拟主机),我看到一个更多的优化。 您可以使用XSendFilefunction让nginx提供这些文件,而不是通过脚本提供静态文件。

马克指出,所以我开始删除所有包括的文件,并归结为:

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

包含

 # 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; 

expires.conf得到了

 # 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"; } 

评论expires.conf ,然后开始工作,我该如何解决这个问题?