1Panel管理后台使用Let'sEncrypt自动续签阿里云域名HTTPS证书

在1Panel后台菜单选择【网站/证书/Acme账户】

然后创建Acme账户

  • 邮箱(输入你自己的邮箱就行)

去阿里云创建RAM用户获取AccessKey和SecretKey

可以参照这个文档:https://help.aliyun.com/zh/ram/user-guide/create-an-accesskey-pair

注意!创建的用户一定要记得添加权限,不然等下申请证书会没权限

在1Panel后台菜单选择【网站/证书/DNS账户】

然后创建DNS账户

  • 名称(随意)
  • Access key(需要在阿里云去创建)
  • Secret key(需要在阿里云去创建)

在1Panel后台菜单选择【网站/证书/申请证书】

这下可以申请证书了

  • 主域名(这里填写你的主域名)
  • 其他域名(这里填写你的子域名)
  • Acme账户(选择你刚才创建的Acme账户)
  • DNS账户(选择你刚才创建的DNS账户)

点击确认 申请!

大概等待5分钟左右就可以申请成功了

这种方式支持自动续签,再也不用阿里云恶心的3个月免费证书了

域名访问失效?小心浏览器自动添加的 `www` 陷阱!

服务器明明已经配置了好了静态文件却无法访问是为什么

你是否精心配置好了服务器上的静态文件,满怀期待地在浏览器地址栏输入自己的一级域名(比如 example.com),结果却遭遇了冷冰冰的 “无法访问此网站” 错误?明明本地测试或通过其他方式访问 example.com 是正常的,为什么直接输入就不行了呢?别急着怀疑人生,问题很可能出在一个容易被忽视的细节上——现代浏览器对 www 前缀的自动补全行为。

现象:输入域名A,浏览器访问了域名B

简单来说:

  1. 你输入: example.com (一级域名)
  2. 浏览器实际访问: www.example.com (浏览器自动在域名前加上了 www!)

原因:Chromium内核的“贴心”特性

如今,绝大多数主流浏览器(Chrome、Edge、Brave、Opera、新版 Firefox 等)都基于 Chromium 内核。这个内核有一个设计初衷是方便用户的功能:**当用户直接在地址栏输入一个没有子域名部分的一级域名时,浏览器会尝试自动在它前面加上 www.**。

  • 输入 example.com -> 浏览器尝试访问 www.example.com

冲突点:服务器配置的局限性

问题就出在这里!你的服务器配置通常是这样的:

  • 你为 example.com 这个域名配置了静态文件服务或虚拟主机。当请求直接访问 example.com 时,服务器知道该去哪里找文件并正确响应。
  • 但是,你很可能没有为 www.example.com 做任何配置。 当浏览器自作主张地请求 www.example.com 时,服务器就懵了:
    • 它找不到为 www.example.com 配置的服务。
    • 或者,该域名指向了错误的目录或根本不存在。
    • 结果自然是服务器无法响应有效的页面,浏览器只能报错。

这就好比你把派对地址告诉了朋友是“公园路123号”(example.com),但朋友导航时却习惯性地输入了“公园路123号大厦”(www.example.com),而这个地方根本不存在或者大门紧锁。

解决方案:一劳永逸的 301 重定向

解决这个问题的核心思路很简单:**告诉服务器,所有访问 www.example.com 的请求,都应该自动、永久地跳转到 example.com**。这就是 301 永久重定向 的用武之地。

为什么是 301

  1. 用户友好:
    • 用户输入 example.com -> 浏览器尝试访问 www.example.com -> 服务器立即返回 301 状态码并指示:“永久搬家到 example.com 了,去那边!” -> 浏览器自动跳转到 example.com -> 成功加载内容。
    • 用户输入 www.example.com -> 同样被重定向到 example.com -> 成功访问。
    • 无论用户输入哪种形式,最终都能无缝抵达正确的 example.com
  2. SEO 优化: 301 重定向明确告诉搜索引擎(如 Google、Bing),www 版本是次要的或已废弃,所有权重、排名和索引都应集中在你的主域名 example.com 上,有效避免内容重复导致的 SEO 问题。

如何配置?

配置方法取决于你使用的 Web 服务器软件。下面以主流服务器 Nginx 配置为例:

Nginx 配置

在 Nginx 的配置文件中(通常在 /etc/nginx/sites-available//etc/nginx/conf.d/ 下,具体看你的配置),为 www.example.com 创建一个专门的 server 块:

server {
    listen 80;
    listen [::]:80;       # IPv6 监听
    server_name www.example.com;  # 捕获所有 www.example.com 的请求

    # 核心:301 永久重定向到无 www 的主域名
    return 301 http://example.com$request_uri;  # 保留原始请求的路径

    # 重要提示:如果站点已启用 HTTPS,应重定向到 HTTPS 版本!
    # return 301 https://example.com$request_uri;
}

Nest.js操控MongoDB的方法

一、安装 nestjs/mongoose 以及 mongoose 模块

Nest 操作 Mongodb 官方文档:https://docs.nestjs.com/techniques/mongodb

1
npm install --save @nestjs/mongoose mongoose

二、配置数据库连接地址

在 app.module.ts 中配置数据库连接

1
2
3
4
5
6
7
8
import { Module } from '@nestjs/common'; 
import { MongooseModule } from '@nestjs/mongoose';

@Module({
imports: [MongooseModule.forRoot('mongodb://localhost/koa',{ useNewUrlParser: true })]
})

export class ApplicationModule {}

三、配置 Schema

1
2
3
4
5
6
7
8
import * as mongoose from 'mongoose'; 

export const ArticleSchema = new mongoose.Schema({
title: String,
keywords:String,
author: Number,
status: String,
});

四、在控制器对应的 Module 中配置 Model

1
2
3
4
5
6
7
8
9
10
11
12
import { Module } from '@nestjs/common'; 
import { NewsController } from './news.controller';
import { NewsService } from './news.service';
import { ArticleSchema } from './schemas/article.schema';
import { MongooseModule } from '@nestjs/mongoose';

@Module({
imports: [MongooseModule.forFeature([{ name: 'Article', schema: ArticleSchema,collection:"article" }])], controllers: [NewsController],
providers: [NewsService]
})

export class NewsModule {}

五、在服务里面使用 InjectModel 获取数据库 Model 实现 操作数据库

1
2
3
4
5
6
7
8
9
10
import { Injectable } from '@nestjs/common'; 
import { InjectModel } from '@nestjs/mongoose';

@Injectable()
export class NewsService {
constructor(@InjectModel('Article') private readonly articleModel) {}
async findAll() {
return await this.articleModel.find().exec();
}
}