编辑nginx的网站配置文件,在location / {} 里面添加如下代码:
try_files $uri $uri/ /index.php?$query_string;
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
break;
}
编辑nginx的网站配置文件,在location / {} 里面添加如下代码:
try_files $uri $uri/ /index.php?$query_string;
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
break;
}
Nginx+PHP+HTTPS的配置模板,如果要部署其它网站,可以基于此进行修改:
# 处理 HTTP 请求,所有请求都重定向到 https://www.jsdd.net
server {
listen 80;
server_name jsdd.net www.jsdd.net; # 同时匹配带 www 和不带 www 的域名
# 所有请求都重定向到 https://www.jsdd.net
return 301 https://www.jsdd.net$request_uri;
}
# 处理不带 www 的 HTTPS 请求,重定向到带 www 的域名
server {
listen 443 ssl http2;
server_name jsdd.net; # 不带 www 的域名
ssl_certificate /etc/nginx/ssl/www.jsdd.net.pem; # 证书路径
ssl_certificate_key /etc/nginx/ssl/www.jsdd.net.key; # 证书路径
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
ssl_ecdh_curve secp384r1;
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
# 重定向所有不带 www 的 HTTPS 请求到 www.jsdd.net
return 301 https://www.jsdd.net$request_uri;
}
# 处理带 www 的 HTTPS 请求
server {
listen 443 ssl http2;
root /var/www/jsdd.net; # 确保这里是正确的根目录路径
index index.html index.htm index.php index.nginx-debian.html;
server_name www.jsdd.net;
client_max_body_size 20m;
ssl_certificate /etc/nginx/ssl/www.jsdd.net.pem; # 确保证书路径正确
ssl_certificate_key /etc/nginx/ssl/www.jsdd.net.key; # 确保证书路径正确
#加上TLSv1,HTTPS检测会报PCI DSS不合规
ssl_protocols TLSv1.2 TLSv1.3;# Requires nginx >= 1.13.0 else use TLSv1.2
ssl_prefer_server_ciphers on;
ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off; # Requires nginx >= 1.5.9
ssl_stapling on; # Requires nginx >= 1.3.7
ssl_stapling_verify on; # Requires nginx => 1.3.7
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
}
Nginx+PHP+HTTP的配置模板,如果要部署其它网站,可以基于此进行修改:
server {
listen 80;
root /var/www/www.example.com;
# Add index.php to the list if you are using PHP
index index.html index.htm index.php index.nginx-debian.html;
server_name www.example.com example.com;
client_max_body_size 20m;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# With php-fpm (or other unix sockets):
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
}
建站初期总有一些事情考虑不周,前几天调整了固定链接,从/category/id.html调整为/archive/id,然后总觉得哪里不踏实。趁着周末去考试的时间想了一下,如果固定链接依赖于文章ID或分类,那么一旦ID或分类发生变化,文章的固定链接就会失效。再者,从长远来说,将来如果要改版或重构网站,基于ID或分类的链接将变得不稳定。
由此,可以得出结论,固定链接最好不要依赖文章ID和分类,而是要依赖于文章的内容。这样的固定链接显得更稳定,而且具有更好的可读性,有利于SEO优化,分享链接时,链接本身也变得更有意义。
所以,决定把本站的固定链接改成基于postname的形式。修改固定链接后,要把之前的文章链接做一个跳转,但是由于文章有点多,手动修改很费时间,于是动手写了一段PHP代码,用于生成Nginx的跳转规则,代码如下:
<?php
// 数据库连接设置
$servername = "localhost"; // 数据库主机
$username = "your_username"; // 数据库用户名
$password = "your_password"; // 数据库密码
$dbname = "your_database"; // 数据库名
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检查连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 查询已发布的文章
$sql = "SELECT ID, post_title, post_name FROM wp_posts WHERE post_status='publish' AND post_type='post'";
$result = $conn->query($sql);
// 检查查询结果
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
$id = $row['ID'];
$post_name = $row['post_name'];
// 生成 Nginx 重定向规则
echo "rewrite ^/archives/$id$ /$post_name permanent;" . "<br>";
}
} else {
echo "没有找到已发布的文章。";
}
// 关闭连接
$conn->close();
?>
运行这段代码,就会在浏览器页面输出重定向规则,我们把它复制到nginx配置里就可以了。
location /archives/ {
rewrite ^/archives/3681$ /letting-go-of-tech-obsession permanent;
# 为了便于展示,这里只粘贴了一条规则...
}
后记:这种基于postname的permalink就是写文章的时候麻烦一点,写完后,还要再把标题翻译成英文,看个人取舍了。后面如果我忍受不了这多余的一步,也可能换成基于post_id的形式。使用postname还有一个好处理就是,如果要换成其它形式,WP可以自动实现跳转,而不用再另写跳转规则。
每次配置nginx反向代理时,都要查一次资料,现在记录在这里,备忘、备查。
server {
listen 80;
server_name www.example.com;
location /{
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8080;
}
}
闲来无事,查看了一下 nginx 的 error.log 日志文件,发现里面大量的报错信息:
cannot load certificate "data:": PEM_read_bio_X509_AUX() failed (SSL: error:0909006C:PEM routines:get_name:no start line:Expecting: TRUSTED CERTIFICATE) while SSL handshaking…
是 ssl 证书报错了,想了一下,整个服务器只有这个博客使用了 https ,理所当然的从博客的 nginx 配置文件和证书文件入手,历时三天也没找到原因,甚至一度把证书都更换了,从腾讯云的 SSL 证书换到了阿里云的 SSL 证书,结果还是报错,说明证书没问题。
就在快要放弃的时候,突然想到,之前为了屏蔽直接从 ip 来的请求,加了一些配置,屏蔽了http://ip
和https://ip
两种访问形式,而屏蔽 https+ip 也涉及到了 SSL 证书的问题,当时是通过 map 映射给了一个空证书,会不会是这个原因?
于是,为了验证这个猜想,把博客站点的错误日志和其它站点的分开,单独统计。过了一夜,第二天打开日志文件查看,果然,博客的错误日志中并没有此错误,只有 error.log 里面有,这就说明错误不是博客站点的 SSL 证书引起的,那么只可能是之前屏蔽 https+ip 的配置引起的。
找到了原因,那么解决起来就快了。
先帖一下之前的配置:
map "" $empty {
default "";
}
server {
listen 80 default_server;
listen 443 ssl http2 default_server;
listen [::]:80 default_server;
listen [::]:443 ssl http2 default_server;
server_name _;
ssl_ciphers aNULL;
ssl_certificate data:$empty;
ssl_certificate_key data:$empty;
return 444;
}
把上面的配置改成如下:
# 禁止直接通过IP访问网站
server {
listen 80 default_server;
server_name _;
return 444;
}
删除了屏蔽 https+ip 的配置,只保留屏蔽 http+ip 的配置。然后在博客站点的 nginx 配置文件中添加如下代码:
# 通过 default_server 把博客站点设置为默认的 https 站点
listen 443 ssl http2 default_server;
if ($host != 'wujie.me') {
rewrite ^/(.*)$ https://wujie.me/$1 permanent;
break;
}
把直接从非域名来的请求(包括从 ip 来的请求)跳转到域名就可以了。
这样修改后,经过两天的观察,没有再出现错误,问题解决!
cd /run
mkdir php && cd $_
touch php7.4-fpm.sock
chown www-data:www-data php7.4-fpm.sock
chmod 777 ./php7.4-fpm.sock
cd /usr/local/php/php74/etc/php-fpm.d
vi www.conf
listen = 127.0.0.1:9074
改为
listen = /run/php/php7.4-fpm.sock
保存后,执行systemctl restart php7.4-fpm
重启 php-fpm 。
fastcgi_pass 127.0.0.1:9074;
改为
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
保存后,执行nginx -s reload
使 nginx 配置生效。
P.S. 可以把 Unix Domain Socket 文件放到 /dev/shm 下以提高性能。因为这个目录不在硬盘上,而是在内存里。
Yet another post script: 这么改完之后,一定记得所有用到这个 PHP-FPM 的站点,nginx 配置都要做如上修改,不然网站就访问不了了。
例如:example.com 跳转到 www.example.com
server {
listen 80;
server_name example.com;
rewrite ^/(.*)$ http://www.example.com/$1 redirect;
access_log off;
}