options = get_option('htaccess_manager_options');
add_action('admin_menu', array($this, 'add_admin_menu'));
add_action('admin_init', array($this, 'admin_init'));
add_action('admin_notices', array($this, 'admin_notices'));
register_activation_hook(__FILE__, array($this, 'activate'));
register_deactivation_hook(__FILE__, array($this, 'deactivate'));
register_uninstall_hook(__FILE__, array('HTACCESS_Manager', 'uninstall'));
}
public function activate() {
// 创建must-use插件目录
$mu_plugins_dir = WP_CONTENT_DIR . '/mu-plugins';
if (!file_exists($mu_plugins_dir)) {
wp_mkdir_p($mu_plugins_dir);
}
// 生成初始选项
if (false === $this->options) {
$default_options = array(
'redirect_type' => 'www_to_root',
'is_subdomain' => false,
'auto_update' => true
);
update_option('htaccess_manager_options', $default_options);
}
$this->update_htaccess();
$this->create_mu_plugin();
}
public function deactivate() {
// 从.htaccess中安全移除本插件的规则
$this->safe_remove_htaccess_rules();
// 清理mu-plugin
$mu_plugin_file = WP_CONTENT_DIR . '/mu-plugins/htaccess-helper.php';
if (file_exists($mu_plugin_file)) {
unlink($mu_plugin_file);
}
}
public static function uninstall() {
// 删除选项
delete_option('htaccess_manager_options');
// 从.htaccess中安全移除规则
self::safe_remove_htaccess_rules_static();
// 清理mu-plugin
$mu_plugin_file = WP_CONTENT_DIR . '/mu-plugins/htaccess-helper.php';
if (file_exists($mu_plugin_file)) {
unlink($mu_plugin_file);
}
}
public function add_admin_menu() {
add_options_page(
'HTACCESS 管理',
'HTACCESS 管理',
'manage_options',
'htaccess-manager',
array($this, 'admin_page')
);
}
public function admin_init() {
register_setting('htaccess_manager', 'htaccess_manager_options');
add_settings_section(
'htaccess_manager_section',
'重定向设置',
array($this, 'section_callback'),
'htaccess_manager'
);
add_settings_field(
'is_subdomain',
'是否为二级域名',
array($this, 'is_subdomain_callback'),
'htaccess_manager',
'htaccess_manager_section'
);
add_settings_field(
'redirect_type',
'重定向类型',
array($this, 'redirect_type_callback'),
'htaccess_manager',
'htaccess_manager_section'
);
add_settings_field(
'auto_update',
'自动更新',
array($this, 'auto_update_callback'),
'htaccess_manager',
'htaccess_manager_section'
);
}
public function section_callback() {
echo '
配置您的网站重定向规则。HTTPS重定向是强制的。
';
}
public function is_subdomain_callback() {
$value = isset($this->options['is_subdomain']) ? $this->options['is_subdomain'] : false;
?>
/>
我的网站使用二级域名(如:sub.domain.com)
如果启用,将只强制HTTPS,不处理www和根域名之间的跳转。
options['redirect_type']) ? $this->options['redirect_type'] : 'www_to_root';
?>
options['is_subdomain']) && $this->options['is_subdomain'] ? 'disabled' : ''; ?> />
www跳转到根域名(www.example.com → example.com)
options['is_subdomain']) && $this->options['is_subdomain'] ? 'disabled' : ''; ?> />
根域名跳转到www(example.com → www.example.com)
options['auto_update']) ? $this->options['auto_update'] : true;
?>
/>
设置更改时自动更新.htaccess文件
HTACCESS 管理
手动更新
如果自动更新失败,您可以手动复制上面的规则到您的.htaccess文件中。
当前.htaccess内容预览
' . esc_textarea($content) . '';
} else {
echo '
.htaccess文件不存在。
';
}
?>
update_htaccess();
echo '';
}
// 处理手动移除
if (isset($_POST['manual_remove']) && check_admin_referer('manual_update', 'htaccess_nonce')) {
$this->safe_remove_htaccess_rules();
echo '已从.htaccess文件中移除所有HTACCESS Manager规则!
';
}
}
public function admin_notices() {
if (isset($_GET['settings-updated']) && $_GET['settings-updated']) {
if (isset($this->options['auto_update']) && $this->options['auto_update']) {
$this->update_htaccess();
echo '';
} else {
echo '';
}
}
}
private function generate_htaccess_rules() {
$rules = array();
$rules[] = 'RewriteEngine On';
$rules[] = '';
if (isset($this->options['is_subdomain']) && $this->options['is_subdomain']) {
// 二级域名情况,只强制HTTPS
$rules[] = '# 强制HTTPS重定向(二级域名)';
$rules[] = 'RewriteCond %{HTTPS} off';
$rules[] = 'RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]';
} else {
// 主域名情况,处理www和HTTPS
$rules[] = '# 同时处理 HTTPS 和 WWW 重定向';
if (isset($this->options['redirect_type']) && $this->options['redirect_type'] === 'root_to_www') {
// 根域名跳转到www
$rules[] = 'RewriteCond %{HTTPS} off [OR]';
$rules[] = 'RewriteCond %{HTTP_HOST} ^' . preg_quote(parse_url(home_url(), PHP_URL_HOST), '.') . '$ [NC]';
$rules[] = 'RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]';
$rules[] = 'RewriteRule ^ https://www.%1%{REQUEST_URI} [L,R=301]';
} else {
// www跳转到根域名(默认)
$rules[] = 'RewriteCond %{HTTPS} off [OR]';
$rules[] = 'RewriteCond %{HTTP_HOST} ^www\. [NC]';
$rules[] = 'RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]';
$rules[] = 'RewriteRule ^ https://%1%{REQUEST_URI} [L,R=301]';
}
}
return implode("\n", $rules);
}
private function update_htaccess() {
$htaccess_file = ABSPATH . '.htaccess';
if (!file_exists($htaccess_file)) {
// 如果.htaccess文件不存在,创建它
touch($htaccess_file);
}
if (is_writable($htaccess_file)) {
$new_rules = $this->generate_htaccess_rules();
// 读取现有内容
$content = file_get_contents($htaccess_file);
// 定义标记
$start_marker = '# BEGIN HTACCESS Manager';
$end_marker = '# END HTACCESS Manager';
// 检查是否已有我们的规则
if (strpos($content, $start_marker) !== false) {
// 替换现有规则
$pattern = '/' . preg_quote($start_marker, '/') . '.*?' . preg_quote($end_marker, '/') . '/s';
$replacement = $start_marker . "\n" . $new_rules . "\n" . $end_marker;
$content = preg_replace($pattern, $replacement, $content);
} else {
// 在文件开头添加新规则(在WordPress规则之前)
$wp_start_marker = '# BEGIN WordPress';
if (strpos($content, $wp_start_marker) !== false) {
$replacement = $start_marker . "\n" . $new_rules . "\n" . $end_marker . "\n\n" . $wp_start_marker;
$content = str_replace($wp_start_marker, $replacement, $content);
} else {
// 如果没有WordPress标记,直接添加到文件开头
$content = $start_marker . "\n" . $new_rules . "\n" . $end_marker . "\n\n" . $content;
}
}
// 清理多余的空行
$content = preg_replace("/(\r\n|\r|\n){3,}/", "\n\n", $content);
file_put_contents($htaccess_file, $content);
return true;
}
return false;
}
private function safe_remove_htaccess_rules() {
$htaccess_file = ABSPATH . '.htaccess';
if (file_exists($htaccess_file) && is_writable($htaccess_file)) {
$content = file_get_contents($htaccess_file);
// 备份原始内容
$backup_content = $content;
// 只移除我们自己的规则标记和内容
$start_marker = '# BEGIN HTACCESS Manager';
$end_marker = '# END HTACCESS Manager';
$pattern = '/' . preg_quote($start_marker, '/') . '.*?' . preg_quote($end_marker, '/') . '\s*\n?/s';
$content = preg_replace($pattern, '', $content);
// 清理多余的空行
$content = preg_replace("/(\r\n|\r|\n){3,}/", "\n\n", $content);
$content = trim($content) . "\n";
// 只有在内容确实发生变化且不为空时才写入
if ($content !== $backup_content && !empty(trim($content))) {
file_put_contents($htaccess_file, $content);
}
return true;
}
return false;
}
public static function safe_remove_htaccess_rules_static() {
$htaccess_file = ABSPATH . '.htaccess';
if (file_exists($htaccess_file) && is_writable($htaccess_file)) {
$content = file_get_contents($htaccess_file);
// 备份原始内容
$backup_content = $content;
// 只移除我们自己的规则标记和内容
$start_marker = '# BEGIN HTACCESS Manager';
$end_marker = '# END HTACCESS Manager';
$pattern = '/' . preg_quote($start_marker, '/') . '.*?' . preg_quote($end_marker, '/') . '\s*\n?/s';
$content = preg_replace($pattern, '', $content);
// 清理多余的空行
$content = preg_replace("/(\r\n|\r|\n){3,}/", "\n\n", $content);
$content = trim($content) . "\n";
// 只有在内容确实发生变化且不为空时才写入
if ($content !== $backup_content && !empty(trim($content))) {
file_put_contents($htaccess_file, $content);
}
return true;
}
return false;
}
private function create_mu_plugin() {
$mu_plugin_content = '