Welcome! Log In Create A New Profile

Advanced

Re: проблема с кирилличными uri при кешировании

VovansystemS
December 17, 2012 04:44PM
Добрый вечер!

После ещё нескольких часов исследований проблему удалось решить! Опишу
вкратце как.

Для начала, нужно выяснить в каком виде в переменных nginx хранит адрес
страницы.

Допустим имеем страницу "http://example.com/test/рашшн" тогда:

$document_uri: /test/рашшн
$request: GET /test/%D1%80%D0%B0%D1%88%D1%88%D0%BD HTTP/1.1
$request_uri: /test/%D1%80%D0%B0%D1%88%D1%88%D0%BD
$uri: /test/рашшн
/test(/.*): /рашшн

Значит, нам нужно преобразовать выделение из последнего локейшна в энкодед
формат. Заюзать что-то типа urlencode() в php.
Такой функции в nginx я не нашёл, но совершенно случайно, во время безумных
игр с переменными, наткнулся на интересное поведение set. Оказывается, если
сделать:
set $uri_encoded $uri;
то $uri_encoded будет закодирован! т.е. при присвоении неэнкодированного
значения переменной, set энкодит это значение.

Таким образом, проблема решилась. В ранее приведённом конфиге стоит
добавить всего лишь одну строку в блок:

location ~ /purge(/.*) {
set $uri_encoded $1; # энкодим выделение
fastcgi_cache_purge MAGE
"$scheme$request_method$host$uri_encoded$is_args$args";
}

Удачи всем и спасибо Игорю за nginx :)

2012/12/17 VovansystemS <vovansystems@gmail.com>

> Добрый день!
>
> Настраивал кеширование сайта на 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
>
> конфиг:
>
> fastcgi_cache_path /tmp/fcgi levels=1:2 keys_zone=MAGE:32m max_size=64m
> inactive=10h;
>
> server {
> listen 80;
> server_name example.com www.example.com;
> charset utf-8;
> error_log off; access_log off;
>
> 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;
>
> fastcgi_cache_bypass $no_cache;
> fastcgi_no_cache $no_cache;
>
> fastcgi_index index.php;
> fastcgi_intercept_errors off;
> fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
> fastcgi_temp_path /tmp/fcgi2 1 2;
> fastcgi_cache MAGE;
> fastcgi_cache_key "$scheme$request_method$host$request_uri";
> fastcgi_ignore_headers "Cache-Control" "Expires" "Set-Cookie";
> fastcgi_cache_min_uses 1;
> fastcgi_cache_valid 30m;
> fastcgi_cache_use_stale updating error timeout invalid_header
> http_500;
> }
>
> location ~ /purge(/.*) {
> #default_type text/plain;
> #echo "fastcgi_cache_purge MAGE
> $scheme$request_method$host$1$is_args$args";
> #echo "fastcgi_cache_key
> $scheme$request_method$host$request_uri";
> fastcgi_cache_purge MAGE
> "$scheme$request_method$host$1$is_args$args";
> }
>
> location ~*
> ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$
> {
> access_log off; log_not_found off; expires max;
> }
>
> }
>
_______________________________________________
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru
Subject Author Posted

проблема с кирилличными uri при кешировании

VovansystemS December 17, 2012 05:02AM

Re: проблема с кирилличными uri при кешировании

VovansystemS December 17, 2012 04:44PM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 201
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready