NGINX 代理到 GCS 存储桶,将所有 URL 重定向到 index.html,在嵌套路由上获取 200 个空白响应

NGINX 代理到 GCS 存储桶,将所有 URL 重定向到 index.html,在嵌套路由上获取 200 个空白响应

我正在配置从 NGINX 到 GCP 云存储存储桶的反向代理,其中包含静态 HTML、JS、图像文件,并将所有不匹配的 URL 重写为 index.html,因为它是一个单页应用程序。

配置:

user nginx;
worker_processes  1;

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


events {
    worker_connections  1024;
}


http {
    include           /etc/nginx/mime.types;
    default_type      application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" upstream: "$upstream_addr"';
    access_log        /var/log/nginx/access.log  main;

    server_tokens     off;

    sendfile        on;

    keepalive_timeout  65;

    gzip              on;
    gzip_disable      "msie6";
    gzip_comp_level   6;
    gzip_min_length   1100;
    gzip_buffers      16 8k;
    gzip_proxied      any;
    gzip_types
        text/plain
        text/css
        text/js
        text/xml
        text/javascript
        application/javascript
        application/x-javascript
        application/json
        application/xml
        application/xml+rss;

    resolver          8.8.8.8 valid=300s ipv6=off;
    resolver_timeout  10s;

    upstream gcs {
       server          storage.googleapis.com:443;
       keepalive       128;
    }


    proxy_cache_path      /var/cache/nginx keys_zone=google-cloud-storage:10m inactive=1h;
    proxy_cache           google-cloud-storage;
    proxy_cache_key       "$host/$proxy_host$uri";
    proxy_cache_valid     200 1m;


    server {
        listen          8080;

        recursive_error_pages on;

        if ( $request_method !~ "GET|HEAD" ) {
            return 405;
        }

        location = / {
            rewrite ^.*$ /index.html last;
        }

        location = /healthz/ {
            access_log off;
            return 200;
        }

        location / {
            proxy_set_header        Host storage.googleapis.com;
            proxy_set_header        Cookie "";
            proxy_set_header        Authorization "";
            proxy_set_header        Connection "";
            proxy_hide_header       x-goog-hash;
            proxy_hide_header       x-goog-generation;
            proxy_hide_header       x-goog-metageneration;
            proxy_hide_header       x-goog-stored-content-encoding;
            proxy_hide_header       x-goog-stored-content-length;
            proxy_hide_header       x-goog-storage-class;
            proxy_hide_header       x-guploader-uploadid;
            proxy_hide_header       x-xss-protection;
            proxy_hide_header       x-goog-meta-goog-reserved-file-mtime;
            proxy_hide_header       accept-ranges;
            proxy_hide_header       alternate-protocol;
            proxy_hide_header       Set-Cookie;
            proxy_hide_header       Expires;
            proxy_hide_header       Cache-Control;
            proxy_ignore_headers    Set-Cookie;
            proxy_http_version      1.1;
            proxy_intercept_errors  on;
            proxy_method            GET;
            proxy_pass_request_body off;

            proxy_ignore_headers    "Expires" "Cache-Control";


            add_header              X-Cache $upstream_cache_status;



            error_page              404 =200 /index.html;



            expires 1h;
            add_header Cache-Control "private";


            proxy_pass              https://gcs/my-bucket-name$uri;
        }
    }
}

问题是这样的:

  1. 没有现在proxy_cache,第一个请求/嵌套/路径返回 200 OK 和 index.html
  2. 浏览器的软重新加载会将标头if-modified-since和/或if-none-match标头发送到代理,但会得到200 OK 响应,内容为空白。(其实应该是304吧?)
  3. 硬重新加载返回 200 并显示正确的 index.html 内容。
  4. 现在proxy_cache,304 已正确返回。
  5. 请求根路径/ 在没有 的情况下也能正确运行proxy_cache

我怎样才能确保在没有的情况下软重新加载的正确行为proxy_cache

答案1

我无法以任何方式完成这项工作,尽管这里有一个据称可以工作的例子:https://github.com/presslabs/gs-proxy

我最终安装了存储桶并简单地通过文件系统使用 nginx。

https://github.com/maciekrb/gcs-fuse-sample

答案2

您可以尝试这样的方法:

    location = / {
        proxy_pass http://www.mybucket.com/index.html;
    }

    location ~* /(.*)$ {
        rewrite /(.*) / ;
    }

应该存在指向 storage.googleapis.com 的 www.mybucket.com 的 CNAME 记录,并且单页应用程序路由器应该管理 404 情况。

相关内容