Hexo部署到云服务器后CSS样式无效的问题

文章讲述了作者在将Hexo博客部署到云服务器时遇到CSS样式失效的问题,经排查发现是Nginx代理设置中Content-Type默认值导致的。通过调整Nginx配置,指定正确的文件类型标识,解决了样式渲染问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Hexo部署到云服务器后CSS样式无效的问题

01 前言

趁活动入手了一个云服务器(Linux),打算简单挂个博客上去,因为之前部署到github有了一些经验,所以还是选择使用Hexo。中间步骤略,部署完使用浏览器访问的时候,碰到一个比较诡异的现象:文字、图案等内容是有了,但是只是直接简单罗列出来的,CSS样式没有生效!
于是先F12简单检查一下浏览器网络请求情况,发现CSS文件请求也是正常的,也正常返回来内容了,但是就是没有渲染到页面!
就像这样:
样式无效

查了一通资料,Hexo配置文件也折腾了一番,还是没有解决。最后认真对比了一下跟GitHub的部署的那套有啥区别之后,发现原来坑是在NGINX代理上。

02 正文

相关软件版本如下:

Nginx:1.18.0
Hexo:7.0.0
Hexo 主题:butterfly,4.11.0

假设博客根目录为:/usr/local/example,先生成静态资源:

hexo clean && hexo g

然后就顺利生成public文件夹了,直接上NGINX代理。
接着,NGINX配置大概是这样的:

http {
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
  
    server {
        listen 80;
        server_name example.com;
        location / {
           expires 1h;
           gzip on;
           root /usr/local/example/public;
           index index.html;
        }
    }
}
events {
     worker_connections  1024;
     use epoll;
}

注意default_type,设置了默认文件类型是:application/octet-stream,这样会导致返回的CSS、JS等文件,Content-Type类型都是:application/octet-stream,虽然文件内容是请求回来了,但是由于文件类型未被浏览器正确识别(或者说浏览器不知道请求回来的XXX.css就是样式文件,XXXX.js就是JavaScript脚本文件),所以没有渲染到页面上!

认真看网络请求中的响应标头的Content-Type,确实是这样:
响应类型

找到了原因,那就好解决了,让不同类型的文件返回时Content-Type类型是对应的文件标识,比如css样式文件,返回类型应该是:text/css,而js文件,返回类型应该是:application/javascript,其他类型文件类似。

结合NGINX官方文档,可知用types来定义返回的文件类型标识,于是将NGINX配置文件修改如下:

http {
    sendfile        on;
    keepalive_timeout  65;
  
    server {
        listen 80;
        server_name example.com;
        location / {
           expires 1h;
           gzip on;
           root /usr/local/example/public;
           index index.html;
           types {
            text/html  html;
            image/gif  gif;
            image/jpeg jpg;
            image/png  png;
            image/vnd.microsoft.icon  ico;
            text/css   css;
            application/javascript  js;
          }
          default_type application/octet-stream;
        }
    }
}
events {
     worker_connections  1024;
     use epoll;
}

重启NGINX,搞定。
正常

03 后记

算是一个简单的问题,记录一下。

04 2023-12-15更新

或者还有一种配置,直接把 mime.types 包含进来,文件类型更加齐全:

http {
    include       mime.types;
    default_type application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
  
    server {
        listen 80;
        server_name example.com;
        location / {
           expires 1h;
           gzip on;
           root /usr/local/example/public;
           index index.html;
        }
    }
}
events {
     worker_connections  1024;
     use epoll;
}

不过需注意的是,如果是指定配置文件启动NGINX的方式,这种配置可能会报错,提示找不到 mime.types文件。
那么只要将mime.types复制到与指定配置文件相同路径下即可。比如:

cp /etc/nginx/mime.types /usr/local/nginx/config/

然后重启:

/usr/sbin/nginx -s reload -c /usr/local/nginx/config/nginx.conf

当然,也可以直接改一下路径:

http {
    include       /etc/nginx/mime.types;
    ... (以下略)
### 部署 Hexo云服务器 Hexo 是一种快速、简洁且高效的静态博客框架,通常用于构建个人博客或技术文档。以下是关于如何将 Hexo 博客部署云服务器的相关说明。 #### 1. 准备工作 在开始之前,需要确保本地环境已经配置好必要的工具和依赖项。这包括 Node.js 和 Git 的安装[^4]。如果尚未完成这些步骤,则需先按照官方指南或其他资源中的方法进行设置。 对于云端部分,可以选用多种类型的主机服务提供商,比如阿里云 ECS 实例、腾讯云 CVM 或 AWS EC2 等实例作为目标机器运行环境。此外还需要确认该虚拟机操作系统版本以及开放端口情况是否满足条件访问需求。 #### 2. 修改 `_config.yml` 文件 为了实现自动化发布功能,在项目的根目录下编辑 `blog/_config.yml` 文件时应加入如下字段定义: ```yaml deploy: type: git repo: github: git@github.com:<username>/<username>.github.io.git,master coding: git@git.coding.net:<username>/<username>.git,master ``` 上述代码片段展示了两种可能的目标仓库地址——GitHub Pages 及 Coding 平台上的私有存储库链接;实际操作过程中只需保留其中一个有效路径即可[^1]。 #### 3. 使用 SSH 密钥认证方式连接远程服务器 考虑到安全性因素,建议通过基于公私密钥对的身份验证机制代替传统密码登录形式来管理与各平台间的数据交换过程。具体做法可参照相关手册创建专属用户的SSH key,并将其添加至对应服务商账户下的授权钥匙列表里头去。 #### 4. 设置自定义域名(可选) 如果有计划绑定个性化网址的话,那么除了正常购买注册之外还需调整DNS解析记录指向新购置的空间IP地址上。与此同时启用HTTPS加密传输协议也是提升用户体验不可或缺的一环,借助Let's Encrypt免费证书或者第三方CDN加速节点如Cloudfalre都可以轻松达成目的。 #### 5. 自动化流程优化提议 随着项目规模扩大和技术栈更新迭代速度加快,手动执行命令难免显得繁琐低效。因此借鉴其他开发者经验教训后推荐尝试引入CI/CD流水线概念简化日常运维事务负担。例如利用 GitHub Actions 来替代原有单纯依靠 hexo-deployer-git 插件单独处理的方式,从而达到更灵活可控的效果[^2]。 ```yaml name: Deploy Blog via GH Action on: push: branches: - main jobs: build-and-deploy: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v2 - name: Setup NodeJS environment uses: actions/setup-node@v2 with: node-version: '16' - run: npm install - run: npm run generate # or whatever your command is called - name: Deploy to Server env: PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} run: | mkdir -p ~/.ssh/ echo "$PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa ssh-keyscan example.com >> ~/.ssh/known_hosts rsync --archive --compress --progress _site/* user@example.com:/path/to/webroot/ ``` 以上脚本示范了一个完整的持续集成管道设计思路,涵盖了从检出源码直至最终同步生成产物整个生命周期内的各个环节要点。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值