【问题标题】:After http -> https nginx does not find static contenthttp -> https 之后 nginx 没有找到静态内容
【发布时间】:2019-02-01 02:05:06
【问题描述】:

我有一个使用 nginx 的静态文件服务的工作设置,使用 http。

后来,当我切换到 https,将端口从 80 更改为 443 以及添加 ssl 证书和密钥时,Web 服务器再也找不到静态文件了。我得到所有静态文件的 404 响应。这是我的 nginx 配置文件:

http {

    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    sendfile on;
    keepalive_timeout 65;


    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
    ssl_prefer_server_ciphers on;


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

    upstream http_backend {
            server 127.0.0.1:3001;
            keepalive 32;
    }

    server {
            listen       80;
            server_name  test.com;

            # Redirect to https
            location / {
                    rewrite ^ https://$host$request_uri permanent;
            }
    }

    server {
            listen 443 default_server ssl;
            server_name localhost;
            root /var/www/myblog/app/resources/public;

            ssl on;
            ssl_certificate /etc/nginx/certificate.crt;
            ssl_certificate_key /etc/nginx/key.pem;

            location / {
                    proxy_redirect off;

                    proxy_pass              http://http_backend;
                    proxy_set_header        Host $host;
                    proxy_set_header        X-Real-IP $remote_addr;
                    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header        X-Forwarded-Host $server_name;
                    proxy_set_header        X-Forwarded-Proto https;

                    access_log /var/www/logs/myblog.access.log;
                    error_log /var/www/logs/myblog.error.log;
            }

            location ^~ /(css|js) {
                    root /var/www/myblog/app/resources/public;
            }
    }
}

我的访问日志:

37.201.226.254 - - [26/Aug/2018:06:41:25 +0000] "GET /js/compiled/foo.js HTTP/1.1" 404 38 "https://www.test.com/" "Mozilla/5.0 (X11; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0"    
37.201.226.254 - - [26/Aug/2018:06:41:25 +0000] "GET /css/mui.css HTTP/1.1" 404 38 "https://www.test.com/" "Mozilla/5.0 (X11; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0"           
37.201.226.254 - - [26/Aug/2018:06:41:25 +0000] "GET /css/style.css HTTP/1.1" 304 0 "https://www.test.com/" "Mozilla/5.0 (X11; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0"

文件在/var/www/myblog/app/resources/public:这是配置为root。我从/var/www/myblog/app 运行网络服务器。

请记住,这是我第一次使用 NGINX 进行部署。有谁知道我忘记配置什么来使用 https 提供静态文件?我的操作系统是 linux。

【问题讨论】:

    标签: ssl nginx https http-status-code-404


    【解决方案1】:

    我通过随机试验和错误发现了问题。由于某种原因,改变了

            location ^~ /(css|js) {
                    root /var/www/myblog/app/resources/public;
            }
    

            location ~ ^/(css/|js/) {
                    root /var/www/myblog/app/resources/public/;
            }
    

    似乎有效。

    【讨论】:

    • 对于任何想知道 some 原因的人来说,这是因为 ^~ 修饰符是前缀修饰符,而不是正则表达式。 Nginx 有 2 个正则表达式修饰符,~ 用于区分大小写匹配,~* 用于不区分大小写匹配。这三个都包含一个波浪号~,但相似之处到此为止。 ^~ 告诉 Nginx,如果此位置块是当前请求的最长匹配前缀位置,则选择此块来处理请求,而不评估任何正则表达式位置块。
    • 非常感谢您提供解决方案。我真的在这个问题上浪费了 4 天时间。
    猜你喜欢
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    相关资源
    最近更新 更多