Apache .htaccess配置:入门掌握伪静态与访问控制
Apache 的 .htaccess 是一个放在网站目录下的纯文本配置文件,用来在不修改主配置文件 httpd.conf 的前提下,对当前目录及其子目录做伪静态、301 跳转、访问限制等设置。
很多零基础用户第一次改 .htaccess 就遇到 500 错误,根本原因通常是服务器没有开启 AllowOverride 权限,或者写入了 Apache 不认识的指令。
下面按“先确认能不能用,再写规则,最后验证”的顺序讲清楚,每一步都给出可直接复制的配置和检查方法。
先确认服务器允许 .htaccess 生效
.htaccess 不是放上去就生效的,Apache 默认可能忽略它。
你需要先检查虚拟主机配置里对应目录的 AllowOverride 值。
在宝塔面板中,打开“网站” → 找到对应站点 → “设置” → “配置文件”,找到类似下面的段落:
Options FollowSymLinks
AllowOverride None
Require all granted
把 AllowOverride None 改成 AllowOverride All,保存后重载 Apache。
命令行下可以执行:
apachectl configtest
systemctl reload httpd # CentOS
systemctl reload apache2 # Debian/Ubuntu
configtest 返回 Syntax OK 才说明主配置没问题。
如果这里报错,先修主配置,不要继续改 .htaccess。
同时确认 mod_rewrite 模块已启用,伪静态规则依赖它:
httpd -M | grep rewrite # CentOS
apache2ctl -M | grep rewrite # Debian/Ubuntu
输出里出现 rewrite_module 才算启用。
宝塔用户一般在“软件商店” → Apache 设置里可以直接勾选。
常用配置片段与写法
.htaccess 文件本身没有扩展名,文件名就是 .htaccess,放在网站根目录。
用记事本或面板文件管理器新建时注意不要变成 htaccess.txt。
开启伪静态(以 WordPress 为例)
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
RewriteCond %{REQUEST_FILENAME} ! 表示请求的文件不存在时才走重写,避免把真实存在的图片、CSS 也转发给 PHP。
-f
整站 301 跳转(换域名时用)
RewriteEngine On
RewriteCond %{HTTP_HOST} ^old.com [NC]
RewriteRule ^(.*)$ https://new.com/$1 [R=301,L]
[R=301,L] 表示返回 301 永久跳转并停止后续规则。
改完后用浏览器访问旧域名,按 F12 看 Network 里状态码是否为 301。
给目录加密码保护
AuthType Basic
AuthName "Restricted"
AuthUserFile /www/wwwroot/你的域名/.htpasswd
Require valid-user
密码文件用命令生成:
htpasswd -c /www/wwwroot/你的域名/.htpasswd admin
系统会提示输入两次密码。-c 只在第一次创建文件时用,后续加用户要去掉 -c,否则会覆盖已有用户。
容易踩坑的地方
500 Internal Server Error 是最常见的报错,九成以上是语法问题或权限问题。
排查顺序:先注释掉刚加的行,看是否恢复;
再用 apachectl configtest 检查主配置;
最后看 Apache 错误日志,路径通常在 /www/wwwlogs/你的域名-error_log 或 /var/log/httpd/error_log。
不要在主配置文件里已经写过的规则又重复写进 .htaccess。
两者叠加会导致重写循环,表现为页面打不开或跳转次数过多。
修改前先备份原文件。
面板文件管理器里可以右键复制一份 .htaccess.bak,出问题能立刻还原。
权限不要设成 777。
.htaccess 一般用 644,所属用户和组与网站目录一致即可。
权限过松反而可能被安全策略拒绝。
改完怎么验证
配置保存后,不需要重启 Apache,.htaccess 是每次请求时读取的(除非服务器做了缓存)。
验证三件事:
- 打开网站首页和一篇内页,确认能正常访问,没有 500 或 404。
- 用
curl -I https://你的域名/旧地址查看返回头,确认 301 跳转的目标地址正确。 - 查看错误日志,确认没有新的
AH开头报错。
如果伪静态不生效,先确认 AllowOverride All 已生效,再确认 mod_rewrite 已加载,最后检查 RewriteBase 是否与实际目录匹配。
常见疑问
.htaccess 修改后需要重启 Apache 吗?
一般不需要,Apache 会在每次请求时读取。但如果改了主配置文件里的 AllowOverride,就必须重载 Apache 才生效。
为什么规则在本地测试正常,上传到服务器就 500?
本地环境可能默认允许所有指令,而线上服务器 AllowOverride 为 None 或没装对应模块。先在服务器上执行 configtest 和模块检查,不要直接怀疑规则本身。
一个网站可以有多个 .htaccess 吗?
可以。每个目录都可以放一个,子目录的规则会继承并覆盖父目录。但规则越多越难维护,建议只在根目录保留必要配置。
伪静态和 301 跳转能写在同一个文件里吗?
能,但要注意顺序。Apache 按从上到下执行,[L] 表示匹配后停止。把具体规则放在前面,通用规则放在后面,避免被提前拦截。