\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' );