free.fr 子目录wp博客伪静态,能正常发文

\blog\.htaccess

# 启用 PHP8.5(Free.fr 虚拟主机)
<ifDefine Free>
    PHP85 1
    # 仅 404:不存在的 URL 交给 WordPress 解析(实现 /%postname%/ 前台访问)
    # 切勿添加 ErrorDocument 405,否则会破坏后台发布
    ErrorDocument 404 /blog/index.php
</ifDefine>

# 保护 .htaccess 文件
<Files .htaccess>
    Order Allow,Deny
    Deny from all
</Files>

# 禁用目录列表显示
Options All -Indexes

# Free.fr 禁止 mod_rewrite,启用会导致 500 Internal Server Error
# 以下规则仅供本地测试(非 Free.fr 环境)
<IfDefine !Free>
    Options +FollowSymlinks -Indexes
    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
        RewriteBase /blog/
        RewriteRule ^index\.php$ - [L]
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule . /blog/index.php [L]
    </IfModule>
</IfDefine>

# BEGIN WordPress
# 在「BEGIN WordPress」与「END WordPress」之间的指令(行)是
# 动态生成的,只应被 WordPress 过滤器修改。
# 任何对标记之间的指令的修改都会被覆盖。
# END WordPress

\blog\wp-content\mu-plugins\free-fr-compat.php

<?php
/**
 * Plugin Name: Free.fr Compatibility
 * Description: 在 Free.fr(无 mod_rewrite)上支持 /%postname%/ 伪静态链接,并修复 REST API 发布。
 */

// REST API 必须走 index.php?rest_route=,不能走 /wp-json/(Free.fr 上会 404)
add_filter( 'rest_url', 'free_fr_rest_url', 10, 4 );
function free_fr_rest_url( $url, $path, $blog_id, $scheme ) {
        return home_url( 'index.php?rest_route=' . $path, $scheme );
}

// 阻止 WordPress 认为 mod_rewrite 可用,避免生成 /wp-json/ 地址
add_filter( 'got_rewrite', '__return_false' );