У меня есть эти правила перезаписи (я пробовал оба, но безрезультатно):
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
чтобы передать параметры моему index.php
сценарий, и в сценарии я получил:
$db->save_hash($_GET['id']);
header('Content-type: image/png');
readfile('images/beacon.png');
break;
Но nginx выдает мне «не найдено», но другие перезаписи работают нормально. Что дает?
это сработало для меня:
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;
}
Марк указал, поэтому я начал удалять все включенные файлы и свелся к следующему:
/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
, то он начинает работать, как это исправить?
Хотя ответ @unlo мне кажется правильным (попробовал себя на чистом виртуальном хосте), я вижу еще одну оптимизацию. Вместо того, чтобы обслуживать статический файл вашим скриптом, вы можете использовать XSendFile функция, позволяющая nginx обслуживать эти файлы.
Согласно документации nginx о том, как location
директива работает:
Местоположение может быть определено строкой префикса или регулярным выражением. ... Поиск регулярных выражений завершается при первом совпадении, и используется соответствующая конфигурация.
На основании дополнительной информации из вашего собственного ответа Отвечая на этот самый вопрос, похоже, что вы намереваетесь иметь несколько директив местоположения, которые будут применяться одновременно прямо в одно и то же время, что явно не разрешено в соответствии с недвусмысленной документацией.
Помните, что nginx быстрее и чище по дизайну. Так что не ждите причуд!