apache 中 server 配置文件(如 httpd.conf)与 .htaccess 中 mod_rewrite 配置的核心区别在于生效范围、性能开销以及权限控制。server 配置文件中的规则是全局生效的,由 apache 主进程在启动时加载,处理请求时无需再次读取文件,因此性能最高;而 .htaccess 文件中的规则是针对特定目录的,apache 必须在每个请求到达该目录时重新解析该文件,这会带来额外的 i/o 开销和性能损耗。此外,server 配置文件通常需要 root 或管理员权限才能修改,适合部署稳定的全局规则;.htaccess 则允许目录所有者在受限权限下自行管理重写规则,适合共享主机环境。

如何在全局配置中实现域名重定向
在 Server 配置文件中,可以通过 块直接定义 RewriteRule 来实现域名重定向,这种方式无需创建额外文件,且对所有访问该虚拟主机的请求立即生效。具体做法是在 httpd.conf 或 sites-available 对应的配置文件中启用 mod_rewrite,然后使用 RewriteEngine On 开启引擎,并通过 RewriteCond 判断主机名,最后用 RewriteRule 将请求永久重定向到目标地址。这种配置方式避免了每请求的文件读取,性能最优。

# /etc/apache2/sites-enabled/example.com.conf
<virtualhost>
ServerName example.com
ServerAlias www.example.com
RewriteEngine On
# 如果主机名不是 example.com,则重定向到 example.com
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^(.*)$ https://example.com$1 [R=301,L]</virtualhost>
上述配置中,RewriteCond 检查 %{HTTP_HOST} 是否匹配带 www 的域名,RewriteRule 捕获路径部分 $1 并拼接到新 URL 后,R=301 表示永久重定向,L 表示停止后续规则处理。重启 Apache 服务后,访问 www.example.com 将被自动跳转到 example.com。
如何在 .htaccess 中实现动态内容重写
在 .htaccess 文件中,可以使用 RewriteRule 将用户友好的 URL 映射到服务器内部的动态脚本文件,例如将 /article/123 重写为 /index.php?id=123。这种做法允许开发者隐藏后端技术细节,同时保持 URL 的简洁性。由于 .htaccess 文件位于网站根目录或子目录中,其规则仅对该目录及其子目录生效,不会影响其他站点或全局配置。需要注意的是,如果启用了 AllowOverride All,Apache 会在每个请求中读取 .htaccess 文件,可能影响性能。
将 WCAG 2 AA 无障碍标准应用于设计系统、UI 组件和网页——通过可运行的验证器进行对比度计算,采用设计 token 模式使颜色天生可访问,设定排版和焦点状态规则,并提供语义检查清单。适用于构建或审查 UI。

# /var/www/html/.htaccess
RewriteEngine On
# 如果请求的不是真实文件或目录
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# 将请求重写为 index.php 并传递查询参数
RewriteRule ^(.*)$ index.php?path=$1 [QSA,L]
在这个例子中,RewriteCond 确保只有当请求的路径不对应真实文件或目录时才触发重写,避免干扰静态资源。RewriteRule 使用正则表达式 ^(.*)$ 捕获整个路径,并将其作为 path 参数传递给 index.php。QSA(Query String Append)标志保留原有的查询字符串,L 标志终止规则处理。这种配置常用于现代 PHP 框架的路由系统。
当 .htaccess 文件被禁用时 mod_rewrite 会怎样
如果 Apache 配置中 AllowOverride 设置为 None,则 .htaccess 文件中的所有 mod_rewrite 规则都将被忽略,即使文件中存在有效的重写指令也不会生效。此时,所有重写逻辑必须迁移到 Server 配置文件中的 或 块内。这一行为确保了安全性,防止未授权用户通过上传 .htaccess 文件篡改服务器行为。在实际运维中,若发现重写规则突然失效,应首先检查 Apache 主配置中对应目录的 AllowOverride 设置是否为 All 或包含 FileInfo。









