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; ?>

如果启用,将只强制HTTPS,不处理www和根域名之间的跳转。

options['redirect_type']) ? $this->options['redirect_type'] : 'www_to_root'; ?>

options['auto_update']) ? $this->options['auto_update'] : true; ?>

HTACCESS 管理


当前生成的规则

手动更新

如果自动更新失败,您可以手动复制上面的规则到您的.htaccess文件中。

当前.htaccess内容预览

' . esc_textarea($content) . ''; } else { echo '

.htaccess文件不存在。

'; } ?>
update_htaccess(); echo '

.htaccess文件已更新!

'; } // 处理手动移除 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 '

设置已保存并更新了.htaccess文件!

'; } else { echo '

设置已保存!请手动更新.htaccess文件。

'; } } } 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 = '