Значит, нам нужно преобразовать выделение из последнего локейшна в энкодед формат. Заюзать что-то типа urlencode() в php.
Такой функции в nginx я не нашёл, но совершенно случайно, во время безумных игр с переменными, наткнулся на интересное поведение set. Оказывается, если сделать: set $uri_encoded $uri; то $uri_encoded будет закодирован! т.е. при присвоении неэнкодированного значения переменной, set энкодит это значение.
Таким образом, проблема решилась. В ранее приведённом конфиге стоит добавить всего лишь одну строку в блок:
Настраивал кеширование сайта на wordpress с помощью модуля ngx_http_fastcgi_module, но столкнулся с некоторыми проблемами.
Проблемы связаны с тем, что сайт использует адреса страниц с русскими буквами. Чтобы управлять кешированием со стороны wordpress используется плагин nginx-helper, для работы которого необходимо чтобы при обращении на адрес http://example.com/purge/news/001 очищался кеш страницы http://example.com/news/001 (и то же самое при наличии аргументов).
Это удалось настроить таким образом, как показано ниже в конфиге и оно работает для всех адресов, кроме тех, в которых есть русские буквы. Проблема заключается в том, что страницы с русскими адресами попадают в кеш с ключём, где uri закодирован в виде %D0%B8%D0%BC%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B, а когда я пытаюсь очистить кеш такой страницы по адресу /purge/имя_страницы, в выделение location ~ /purge(/.*) попадает незакодированный uri "имя_страницы" и очистить кеш не получается - т.к. я неправильно обращаюсь к странице по ключу.
Я перепробывал уже множество вариантов с различными переменными, но так и не получил нужного результата. Возможно есть какое-нибудь элегантное решение проблемы?
Linux example 2.6.32-042stab049.7 #1 SMP Thu Mar 1 18:03:05 MSK 2012 x86_64 GNU/Linux
nginx version: nginx/1.2.6
root /home/user/example.com; index index.php index.html index.htm;
set $no_cache 0;
# POST requests and urls with a query string should always go to PHP if ($request_method = POST) { set $no_cache 1; }
if ($query_string != "") { set $no_cache 0;
}
# Don't cache uris containing the following segments if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
set $no_cache 1; }
# Don't use the cache for logged in users or recent commenters if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
set $no_cache 1; }
location / { # This is cool because no php is touched for static content. # include the "?$args" part so non-default permalinks doesn't break when using query string
try_files $uri $uri/ /index.php?$args; } # all other .php files location ~ \.php$ {
try_files $fastcgi_script_name =404; include fastcgi_params; fastcgi_pass unix:/var/run/fpm-v.sock;