Nginx Если cookie существуют в другом месте - PullRequest
0 голосов
/ 03 мая 2018

У меня есть файл конфигурации nginx, который использует сервис prerender, Я хочу проверить, существуют ли куки-файлы access_token, а затем служить локальным угловым, и если cookie не существует (пользователь не вошел в систему), то запрос на передачу прокси в службу prerender,

и вот мой конфигурационный файл nginx,

proxy_cache_path /etc/nginx/cache levels=1:2 keys_zone=prerendercloud_cache:10m max_size=100m inactive=60m use_temp_path=off;

server {
    set \$root /var/www/;
    resolver 8.8.8.8;
    set \$prerendercloud 'service.prerender.cloud';

    listen 80;
    server_name _; 

    location = / {
        if (\$http_cookie ~* "access_token" ) {
            root \$root;
            try_files \$uri \$uri/ /index.html;
            index index.html;
        }

        root \$root;
        try_files \$uri @prerendercloud;
    }

    location / {
        root \$root;
        try_files \$uri \$uri/ /index.html;
        index index.html;
    }



    location @prerendercloud {
        proxy_set_header Accept-Encoding "gzip";
        gunzip on;
        root \$root;
        proxy_set_header X-Prerender-Token 'my_token';
        proxy_cache prerendercloud_cache;
        proxy_cache_valid 200 5m;
        proxy_intercept_errors on;
        error_page 429 500 502 503 504 =200 /index.html;
        proxy_cache_use_stale updating;
        set \$prerender 0;
        if (\$uri ~ "^(([^.]|\.html?)+)\$") {
            set \$prerender "EXTENSION";
        }
        set \$prerender "\${prerender}-USER_AGENT";
        if (\$http_x_prerendered ~ true) {
            set \$prerender 0;
        }
        if (\$http_user_agent ~ "prerendercloud") {
            set \$prerender 0;
        }
        proxy_cache_key "\$prerender\$host\$uri";

        if (\$prerender = "EXTENSION-USER_AGENT") {
            rewrite .* /\$scheme://\$host\$request_uri? break;
            proxy_pass http://\$prerendercloud\$uri;
            break;
        }
        rewrite .* /index.html break;
    }

}

и вот ошибка, которую мне дает nginx:

nginx: [emerg] "try_files" directive is not allowed here in /etc/nginx/conf.d/default.conf:30

Я должен добавить, что знаки доллара экранированы, потому что этот файл находится внутри моей точки входа в докер.

1 Ответ

0 голосов
/ 03 мая 2018

Я нашел решение и вот мой конфигурационный файл, который работает:

proxy_cache_path /etc/nginx/cache levels=1:2 keys_zone=prerendercloud_cache:10m max_size=100m inactive=60m use_temp_path=off;

server {
    set $root /var/www/;
    resolver 8.8.8.8;
    set $prerendercloud 'service.prerender.cloud';
    listen 80;
    server_name _;

    root $root;

    location = / {
        try_files $uri @prerendercloud;
    }


    location / {
        try_files $uri $uri/index.html $uri/ /index.html;
        index index.html;
    }

    location @prerendercloud {
        proxy_set_header Accept-Encoding "gzip";
        gunzip on;
        proxy_set_header X-Prerender-Token 'my_token';
        proxy_cache prerendercloud_cache;
        proxy_cache_valid 200 5m;
        proxy_intercept_errors on;
        error_page 429 500 502 503 504 =200 /index.html;
        proxy_cache_use_stale updating;
        set $prerender 0;
        if ($uri ~ "^(([^.]|\.html?)+)$") {
            set $prerender "EXTENSION";
        }
        set $prerender "${prerender}-USER_AGENT";
        if ($http_x_prerendered ~ true) {
            set $prerender 0;
        }

        if ($http_user_agent ~ "prerendercloud") {
            set $prerender 0;
        }

        if ($http_cookie ~* "access_token" ) {
            set $prerender 0;
        }

        proxy_cache_key "$prerender$host$uri";



        if ($prerender = "EXTENSION-USER_AGENT") {

            rewrite .* /$scheme://$host$request_uri? break;
            proxy_pass http://$prerendercloud$uri;
            break;
        }

        rewrite .* /index.html break;
    }

}

теперь я знаю, что nginx rewrite - это не просто перенаправление запроса с 301 или 302. Он также может обрабатывать контент сервера, связанный с другим местоположением. поэтому самое важное, что я обнаружил, это переписать! = redirect (301, 302)

...