AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 749321
Accepted
Tim
Tim
Asked: 2016-01-16 00:39:57 +0800 CST2016-01-16 00:39:57 +0800 CST 2016-01-16 00:39:57 +0800 CST

Nginx: Alternativa para se dentro de blocos de localização para cache de cabeçalhos com base em uma variável

  • 772

Estou tentando usar o cache de página do Nginx em vez do cache do Wordpress. O cache parece funcionar bem, mas estou tendo problemas para definir cabeçalhos de cache condicionais com base em uma variável - se um usuário está conectado ao wordpress. Se um usuário estiver conectado, quero cabeçalhos sem cache aplicados; caso contrário, a página pode ser armazenada em cache por um dia pelo Wordpress e pelo CDN. Estou descobrindo que só posso adicionar um cabeçalho dentro de uma instrução if.

Eu li (mas não entendi totalmente, porque é tarde aqui) [se é mau] [1]. Também encontrei uma resposta na troca de pilha (no meu laptop, não consigo encontrá-la agora) que dizia que dentro de um bloco if apenas um add_header funciona.

Alguém pode me dar ideias para uma alternativa que pode funcionar melhor? Sei que posso combinar expirações com o controle de cache, mas quero mais cabeçalhos lá, além de entender e aprender.

Aqui está uma configuração significativamente simplificada com as partes relevantes no lugar.

server {
  server_name example.com;

  set $skip_cache 0;
  # POST requests and urls with a query string should always go to PHP
  if ($request_method = POST) {
    set $skip_cache 1;
  }
  if ($query_string != "") {
    set $skip_cache 1;
  }
  # Don't cache uris containing the following segments.
  if ($request_uri ~* "/wp-admin/|/admin-*|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {
    set $skip_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 $skip_cache 1;
  }

  location / {
    try_files $uri $uri/ /blog/index.php?args;
  }

  location ~ \.(hh|php)$ {
    fastcgi_keep_conn on;
    fastcgi_intercept_errors on;
    fastcgi_pass  php;
    include  fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

    # Cache Stuff
    fastcgi_cache CACHE_NAME;
    fastcgi_cache_valid 200 1440m;
    add_header X-Cache $upstream_cache_status;

    fastcgi_cache_methods GET HEAD;
    fastcgi_cache_bypass $skip_cache;
    fastcgi_no_cache $skip_cache;

    add_header Z_ABCD "Test header";

    if ($skip_cache = 1) {
      add_header Cache-Control "private, no-cache, no-store";
      add_header CACHE_STATUS "CACHE NOT USED";
    }
    if ($skip_cache = 0) {
      add_header Cache-Control "public, s-maxage = 240";
      expires 1d;
      add_header CACHE_STATUS "USED CACHE";
    }

    add_header ANOTHER_HEADER "message";
    }
}
nginx
  • 2 2 respostas
  • 3712 Views

2 respostas

  • Voted
  1. Richard Smith
    2016-01-16T02:34:21+08:002016-01-16T02:34:21+08:00

    Uma alternativa à ifdiretiva é a mapdiretiva. E assumindo que o CACHE_STATUSvs CACHE_STATICé apenas um erro de digitação na sua pergunta, você pode tentar isso:

    map $http_cookie $expires {
        default 1d;
        ~*wordpress_logged_in off;
    }
    map $http_cookie $control {
        default "public, s-maxage = 240";
        ~*wordpress_logged_in "private, no-cache, no-store";
    }
    map $http_cookie $status {
        default "USED CACHE";
        ~*wordpress_logged_in "CACHE NOT USED";
    }
    server {
        ...
        location ~ \.(hh|php)$ {
            ...
            expires $expires;
            add_header Cache-Control $control;
            add_header CACHE_STATUS $status;
        }
    }
    

    As mapdiretivas devem ser colocadas dentro do httpcontainer (no mesmo nível do serverbloco) conforme mostrado acima.

    A mapdiretiva está documentada aqui .

    • 1
  2. Best Answer
    Tim
    2016-01-16T13:23:48+08:002016-01-16T13:23:48+08:00

    Eu mesmo criei uma solução, com base na resposta que @Richard Smith forneceu que não fazia exatamente o que eu precisava. Em vez disso, usei o cabeçalho more cache-control e descartei a diretiva expires desnecessária.

    Isso fica dentro do bloco do servidor

    if ($skip_cache = 1) {
      set $cacheControl "private, max-age=0, s-maxage=0, no-cache, no-store";
    }
    if ($skip_cache = 0) {
      set $cacheControl "public, max-age=86400, s-maxage=86400";
    }
    

    Então isso vai dentro de cada bloco de localização aplicável

    add_header Cache-Control $cacheControl;
    

    Isso significa que nenhum "se" é necessário dentro do bloco de localização. Acho que isso resolve o problema, mas ainda estou interessado se alguém tiver ideias alternativas.

    • 0

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve