kradwhite
@kradwhite
https://github.com/kradwhite

Как настроить nginx на обработку куки?

Существующий конфиг
server {
        error_page 404 = $document_root/404.html;
        set $cats $cookie_q;

        if ($cats = 0) {
                set $cats $args_q;
        }
        if ($cats = 0) {
                return 404;
        }

        listen 80;
        server_name site.ru www.site.ru;
        root /path/to/site/public_html;
        rewrite ^([^.\?]*[^/])$ $1/ permanent;

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        location = /wp-login.php {
                deny all;
                return 404;
        }

        location ~* \.(git|htaccess|htpasswd)$ {
                deny all;
                return 404;
        }

        location = /favicon.ico {
                log_not_found off;
                access_log off;
        }

        location = /robots.txt {
                allow all;
                log_not_found off;
                access_log off;
        }

        location ~ /\.ht {
                deny all;
                return 404;
        }

        location ~* \.(gif|jpeg|jpg|txt|png|tif|tiff|ico|jng|bmp|doc|pdf|rtf|xls|xlsx|ppt|rar|rpm|swf|zip|bin|deb|cur|ttf|woff|woff2|svg|xml|json|eot)$ {
                expires 180m;
        }

        location ~* \.(css|js)$ {
                expires 180m;
        }

        location / {
                fastcgi_intercept_errors on;
                try_files $uri $uri/index.php /index.php 404;
                fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }


На данный момент возвращает на любой запрос :
siter.u/404/404/404/404/404/404/404/404/404/404/40...

в куке или get параметре q записан адрес сайта.

Мне нужно следующее:
если установлена кука q взять с нее адрес и проксировать запрос туда.
если куки нет проверить get параметр q взять с него адрес и проксировать запрос туда.
если нет ни куки ни get параметра выдать 404.
Как это реализовать?
  • Вопрос задан
  • 1135 просмотров
Решения вопроса 1
alekciy
@alekciy
Вёбных дел мастер
Делается стандартно через map (пишется в http секцию!):
map "$arg_q:$cookie_q" $my_upstream {
        default 404;
        "~^:(?<cookie>.+)$" $cookie;
        "~^(?<get>.+):$" $get;
    }

Тогда в нужном server можно использовать так:
server {
    if ($my_upstream = 404) {
        return 404;
    }
    ...
    proxy_pass http://$my_upstream;

Неплохо описание есть тут см. секцию "Выбор upstream". Как раз под указанный случай.
Обращаю внимание, что в исходной ТЗ не рассмотрен вариант "есть и кука и гет параметр". Что тогда? В приведенном мною конфиге будет 404.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы