Apache伪静态需虚拟目录与.htaccess协同:虚拟目录须设AllowOverride All和FollowSymLinks,.htaccess放根目录并用相对路径;多域名时用RewriteCond按HTTP_HOST隔离规则。

Apache虚拟目录配合.htaccess实现伪静态,关键在于两层协同:虚拟目录定义站点入口和权限边界,.htaccess在该目录内灵活接管URL重写。二者不是替代关系,而是“容器+行为”的配合——虚拟目录管“在哪跑”,.htaccess管“怎么转”。
虚拟目录必须明确启用.htaccess支持
默认情况下,Apache会忽略目录下的.htaccess文件。要在虚拟目录中让它生效,必须在<directory></directory>块中显式允许:
- 在
httpd-vhosts.conf的对应<virtualhost></virtualhost>内,为该目录添加<directory></directory>节点 - 该节点中必须包含:
AllowOverride All(不能是None或FileInfo等子集,伪静态需FileInfo和Indexes等权限) - 同时确保
Options FollowSymLinks已启用(rewrite依赖符号链接解析)
示例配置片段:
DocumentRoot "/var/www/myapp"
ServerName example.com
AllowOverride All
Require all granted
Options FollowSymLinks
.htaccess文件要放在虚拟目录根下且路径相对
.htaccess的作用范围仅限于它所在目录及其子目录。若虚拟目录指向/var/www/myapp,则.htaccess必须放在此路径下,规则中的路径也按此为基准写:
将 WCAG 2 AA 无障碍标准应用于设计系统、UI 组件和网页——通过可运行的验证器进行对比度计算,采用设计 token 模式使颜色天生可访问,设定排版和焦点状态规则,并提供语义检查清单。适用于构建或审查 UI。
- 匹配URL时用相对路径,比如
RewriteRule ^article/(\d+)\.html$ index.php?id=$1,不加/前缀 - 重写目标如果是同目录PHP脚本,直接写
index.php?id=$1;跨子目录需补全路径,如./api/handler.php?uid=$1 - 若项目部署在子路径(如
example.com/blog/),需加RewriteBase /blog/,否则重写会误判路径层级
常见冲突点:权限继承与模块加载
即使.htaccess存在且语法正确,仍可能失效,主因有二:
-
上级目录权限覆盖:若父目录(如
/var/www)的<directory></directory>设了AllowOverride None,而子目录未单独声明AllowOverride All,则子目录的.htaccess被无视 -
rewrite模块未全局启用:确认
httpd.conf中LoadModule rewrite_module modules/mod_rewrite.so已取消注释,且mod_rewrite出现在phpinfo()的Loaded Modules列表中
验证方式:在.htaccess里临时加一行deny from all,如果访问直接403,说明.htaccess已生效;否则先查AllowOverride和模块加载。
实用技巧:多域名共用同一虚拟目录时的伪静态隔离
一个虚拟目录可响应多个域名(如site1.com和site2.com都指向/var/www/shared),此时伪静态规则需区分来源:
- 用
RewriteCond %{HTTP_HOST}判断域名,再执行不同规则 - 例如:
RewriteCond %{HTTP_HOST} ^site1\.com$ [NC]RewriteRule ^news/(.*)$ /site1/index.php?slug=$1 [L]RewriteCond %{HTTP_HOST} ^site2\.com$ [NC]RewriteRule ^news/(.*)$ /site2/index.php?slug=$1 [L] - 注意末尾加
[L]终止后续规则,避免交叉干扰

















