Re: ЧПУ и 301 redirect

Maxim Dounin mdounin at mdounin.ru
Sun Nov 11 19:38:31 UTC 2012


Hello!

On Sun, Nov 11, 2012 at 09:37:41AM -0500, Renat wrote:

> Максим, попав на /{a}/{b} nginx должен отдать /?page={a}&lang={b}. Но он не
> должен менять url.

Сделайте в этом месте прямое обращение к бекенду - и будет вам 
счастье.  А иначе у вас цикл

Как-то так должно работать:

    location / {
        # just in case - тут проверку я поменял на сколько-нибудь 
        # разумную, ибо "/?" у вас очевидно неверно; если нужна 
        # менее строгая проверка - поправить по необходимости

        if ($args ~* "^page=[a-z0-9]+&lang=[a-z]+$") {
            rewrite ^ /$arg_page/$arg_lang? permanent;
        }

	rewrite ^/([a-z0-9]+)/([a-z]+)(/?)+$ /backend?page=$1&lang=$2 last;
    }

    location = /backend {
        # для прокси - просто меняем путь обратно на /:

        proxy_pass http://backend.example.com/;

        # для php via fastcgi - как-то так:

        fastcgi_pass ...;
        fastcgi_param SCRIPT_FILENAME /path/to/index.php; 
        ...
    }


А ещё лучше - сделайте прямое обращение к бекенду без 
всяких преобразований, и пусть бекенд занимается разбором URL'ов 
на составляющие.  Придумывать костыль из nginx'а и rewrite-правил, 
вместо того чтобы нормально разобрать адрес на полноценном языке 
программирования - то неправильно.

-- 
Maxim Dounin
http://nginx.com/support.html



Подробная информация о списке рассылки nginx-ru