打开我的Blog的分类页, 竟然变成这个烂样子了:
很糟糕啊😒.
F12看了看, 静态资源基本上全是404. 把分类页面一个个点开看了看, 发现有一些页面竟然是正常的:
对比一下两者, 发现两者之间的区别是错误的资源链接里面多了个/category/{slug}.
看一看源码, 逐个函数追踪, 看看到底是在哪里生成了错误的URL. 最终发现出现错误的地方在/var/Typecho/Request.php中的getBaseUrl()
函数处, 打印一些日志看看问题何在:
//处理baseUrl
$filename = (isset($_SERVER['SCRIPT_FILENAME'])) ? basename($_SERVER['SCRIPT_FILENAME']) : '';
echo "debug: script filename: " . $_SERVER['SCRIPT_FILENAME']; // 打印SCRIPT_FILENAME
echo "<br>debug: filename:" . $filename; // 打印filename
echo "<br>debug: script name: " . $_SERVER['SCRIPT_NAME']; // 打印SCRIPT_NAME
if (isset($_SERVER['SCRIPT_NAME']) && basename($_SERVER['SCRIPT_NAME']) === $filename) {
$baseUrl = $_SERVER['SCRIPT_NAME'];
} elseif (isset($_SERVER['PHP_SELF']) && basename($_SERVER['PHP_SELF']) === $filename) {
$baseUrl = $_SERVER['PHP_SELF'];
} elseif (isset($_SERVER['ORIG_SCRIPT_NAME']) && basename($_SERVER['ORIG_SCRIPT_NAME']) === $filename) {
$baseUrl = $_SERVER['ORIG_SCRIPT_NAME']; // 1and1 shared hosting compatibility
} else {
// Backtrack up the script_filename to find the portion matching
// php_self
// .........
}
echo "<br>debug: baseUrl: " . $baseUrl; // 打印baseUrl
// Does the baseUrl have anything in common with the request_uri?
$finalBaseUrl = null;
$requestUri = $this->getRequestUri(); // 打印requestUrl
echo "<br>debug: requestUri: " . $requestUri;
category/经验 | category/WP |
---|---|
问题出在$_SERVER['SCRIPT_NAME']
上! 而且看起来和中文有关. 检查了一下, 发现确实是这样. 那么这个中文问题是怎么来的呢? 首先去检查一下Nginx的配置吧. 另外Nginx的rewrite模块对UTF-8中文支持也有问题, 很有可能问题就出在Nginx上.
location ~ .*\.php(\/.*)*$ {
set $path_info "";
set $real_script_name $fastcgi_script_name;
if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
set $real_script_name $1;
set $path_info $2;
}
fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
fastcgi_param SCRIPT_NAME $real_script_name;
fastcgi_param PATH_INFO $path_info;
include /etc/nginx/snippets/php-fpm.conf;
}
Nginx配置如上所示, 不知道是在哪里抄的. 将设置fastcgi_param参数的相关部分注释掉, 重新加载Nginx. 刷新页面, 正常了.
结论就是, 别乱抄Nginx的配置.
官方有现成的容器了,你可以直接用官方的docker镜像起,这些玩意都是自动的