关于 DreamCat

主题名称:DreamCat | 版本:3.0.240224

主题开发:HanFengA7 | CornWorld

Designed by HanFengA7 Power by Typecho

Copyright © 2015-2024 by LychApe All rights reserved!

menu
refresh

记录一次调试Typecho的经历

作者: ciaoℒy

时间:

打开我的Blog的分类页, 竟然变成这个烂样子了:

image-20221101193530003

很糟糕啊😒.

F12看了看, 静态资源基本上全是404. 把分类页面一个个点开看了看, 发现有一些页面竟然是正常的:

image-20221101193824432

对比一下两者, 发现两者之间的区别是错误的资源链接里面多了个/category/{slug}.

image-20221101194038394

看一看源码, 逐个函数追踪, 看看到底是在哪里生成了错误的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
image-20221101195158088 image-20221101195227339

问题出在$_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. 刷新页面, 正常了.

image-20221101195909247

结论就是, 别乱抄Nginx的配置.


nginx的中文rewrite规则 _51CTO博客_nginx rewrite规则


#本文链接:https://blog.chaol.top/archives/68.html
#本文采用 CC BY-NC-SA 4.0 协议进行许可
#如无特别声明,该文章均为 ciaoℒy 原创,转载请遵循 署名-非商业性使用 4.0 国际(CC BY-NC 4.0)协议,即转载请注明文章来源。
#最后编辑时间为: 2022 年 11 月 01 日
none

create 添加新评论


account_circle
email
language
textsms


assessment 仅有一条评论
  1. 2023-11-20 22:17

    官方有现成的容器了,你可以直接用官方的docker镜像起,这些玩意都是自动的




加我的QQ
加我的微博
加我的支付宝
加我的微信