Nginx 缓存网页?用户必须每次刷新才能看到主页和文章的更新

Nginx 缓存网页?用户必须每次刷新才能看到主页和文章的更新

我们的大多数使用 Nginx +MySQL+PHP-FPM(以及使用 WordPress 作为 CMS)的服务器都遇到了问题:浏览器无法显示我们网页的最新版本。

我会这样解释:

  • 我们的访问者第一次加载时,主页显示正常。
  • 我们添加新文章和内容,并从 Wordpress 发布。
  • 当用户再次加载主页时,他会看到与之前完全相同的页面,没有任何变化。
  • 他必须重新加载主页(Ctrl+F5、Command+r)才能看到主页上的新文章和内容。

但在我们的一台服务器中,情况更加糟糕,一些用户必须清除浏览器上的缓存(例如,Internet Explorer 就出现了严重的问题),然后才能看到最终发布的新文章的新主页。

当用户在帖子上添加新评论时也会发生同样的情况:除非用户刷新网页,否则评论不会显示。一切似乎都在缓存,但我不知道具体原因。

我在这些博客上没有使用 wordpress 中的任何缓存插件,所以发生这种情况的唯一原因是 Nginx 中的配置错误。

根据要求,这里有两个“重要”的文件:

/etc/nginx/nginx.conf


user www-data;
worker_processes  4;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  4096;
    use epoll;
    multi_accept on;
    accept_mutex_delay 50ms;
}

http {
    include       /etc/nginx/mime.types;

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

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    tcp_nodelay        on;
    expires max;
    server_tokens off;
    gzip  on;
    gzip_static on;
    gzip_proxied any;
    gzip_types text/plain text/css application/x-javascript text/xml text/javascript application/xml;
    gzip_vary  on;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

和 /etc/nginx/sites-enabled/mysite.com

server {

            listen   80;
            server_name  mysite.com *.mysite.com;
            rewrite ^/(.*) http://www.mysite.com/$1 permanent;
           }


server {
              listen   80;
#             access_log  /var/www/mysite/log/access.log;
#             error_log      /var/www/mysite/log/error.log info;
              server_name     www.mysite.com;
              root /var/www/mysite/;

          location / {
              index index.php;
              try_files $uri $uri/ /index.php?q=$uri&$args;
              # if the requested file exists, return it immediately
              if (-f $request_filename) {
              break;
          }

          # all other requests go to WordPress
          if (!-e $request_filename) {
                rewrite . /index.php last;
           }
      }

## Images and static content is treated different
    location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml)$ {
      access_log        off;
      expires           30d;
      root /var/www/mysite/;
    }


## Parse all .php file in the /var/www directory
    location ~ .php$ {
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        fastcgi_pass   backend;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/mysite/$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_param  QUERY_STRING     $query_string;
        fastcgi_param  REQUEST_METHOD   $request_method;
        fastcgi_param  CONTENT_TYPE     $content_type;
        fastcgi_param  CONTENT_LENGTH   $content_length;
        fastcgi_intercept_errors        on;
        fastcgi_ignore_client_abort     on;
        fastcgi_read_timeout 180;
    }


    ## Disable viewing .htaccess & .htpassword
    location ~ /\.ht {
        deny  all;
    }
}

upstream backend {
              server 127.0.0.1:9000;
        }
}

希望有帮助...

答案1

你有expires max;在您的http部分中,这将Expires标题设置为 2037 年 12 月 31 日 23:59:59 GMT,并将其Cache-Control max-age设置为 10 年。

答案2

从全球来看,你有一个最大有效期限;在您的 http {} 中设置

http://wiki.nginx.org/HttpHeadersModule

这可能就是告诉浏览器,除非刷新,否则页面加载时不会有新数据。

相关内容