群晖NAS托管网站RewriteRule不生效问题求助
群晖DS216 Apache RewriteRule 不生效的排查与解决
1. 启用mod_rewrite模块
群晖默认未开启该模块,需手动配置:
- 打开DSM控制面板,进入Web服务 > Apache HTTP Server
- 勾选「启用mod_rewrite」选项,保存后重启Apache服务
2. 放开.htaccess权限限制
群晖Apache默认限制了.htaccess的配置覆盖能力,需修改虚拟主机设置:
- 找到站点对应的Apache配置文件,路径一般为
/usr/local/etc/apache2/sites-enabled/你的站点配置.conf - 在
<Directory "/volume1/web/你的站点目录">段落中,将AllowOverride None修改为AllowOverride All,示例如下:<Directory "/volume1/web/your-site"> Options FollowSymLinks AllowOverride All Require all granted </Directory> - 修改完成后重启Apache服务
3. 修正.htaccess规则配置
原规则存在顺序不合理、重复开启引擎、缺少终止标志的问题,替换为以下配置:
ErrorDocument 404 /404.php <IfModule mod_rewrite.c> RewriteEngine On # 优先强制HTTPS跳转 RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # 移除URL中的index.php RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC] RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L] # 页面重写,添加[L]标志终止后续规则执行 RewriteRule ^experience/?$ experience.php [L] RewriteRule ^development/?$ development.php [L] RewriteRule ^portfolio/?$ portfolio.php [L] </IfModule>
- 将HTTPS跳转放在最前,避免重写后跳转引发的逻辑混乱
- 给每个页面重写规则添加
[L]标志,匹配成功后不再执行后续规则 - 删除重复的
RewriteEngine On声明
4. 清除缓存测试
之前的301跳转可能被浏览器缓存,建议用隐私模式访问站点,或手动清除浏览器缓存后再测试
5. 检查文件与权限
- 确认
experience.php等文件存在于网站根目录,且文件名大小写与规则一致(群晖基于Linux,文件系统大小写敏感) - 设置文件权限为
644、目录权限为755,确保Apache进程拥有读取权限
内容的提问来源于stack exchange,提问作者Zen777
相关产品推荐
相关产品推荐

