如何配置RewriteRule使其同时适配主域名与子域名
问题排查与解决方案
1 优先确认虚拟主机目录权限配置
编辑/etc/apache2/sites-enabled/subdomain-le-ssl.conf,找到对应站点根目录的<Directory>配置段,确保包含以下配置:
<Directory /path/to/your/site/root> AllowOverride All Require all granted RewriteEngine On </Directory>
修改后执行systemctl reload apache2重载配置。
注意:AllowOverride None会完全禁用.htaccess文件,是这类问题最常见的诱因
2 虚拟主机全局配置的规则适配
如果你直接把重写规则写到虚拟主机配置的全局段(不在<Directory>段内),需要修改规则匹配的路径前缀,Apache虚拟主机全局的重写规则匹配的是绝对路径,需要在规则开头加/:
<IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^/\.well-known/host-meta /nextcloud/public.php?service=host-meta [QSA,L] RewriteRule ^/\.well-known/host-meta\.json /nextcloud/public.php?service=host-meta-json [QSA,L] RewriteRule ^/\.well-known/webfinger /nextcloud/public.php?service=webfinger [QSA,L] RewriteRule ^/\.well-known/carddav /nextcloud/remote.php/dav/ [R=301,L] RewriteRule ^/\.well-known/caldav /nextcloud/remote.php/dav/ [R=301,L] </IfModule>
更稳妥的方式是把规则直接写到上述<Directory>段内,写法和.htaccess完全一致,不需要修改路径前缀。
3 排除301缓存干扰
301重定向是永久重定向,会被浏览器长期缓存,测试时请使用无痕窗口,或者用curl命令直接验证规则是否生效:
curl -v https://subdomain.server.org/.well-known/carddav
如果返回的HTTP头部包含Location: /nextcloud/remote.php/dav/就说明规则已经生效,浏览器访问404是本地缓存导致。
4 确认Nextcloud配置适配
打开Nextcloud根目录下的config/config.php,确认trusted_domains数组中已经添加了你的子域名:
'trusted_domains' => array ( 0 => 'server.org', 1 => 'subdomain.server.org', ),
如果配置了overwritehost、overwrite.cli.url参数,也需要同步调整为对应子域名,避免Nextcloud内部强制跳转到主域名。
内容的提问来源于stack exchange,提问作者Kalle
相关产品推荐
相关产品推荐

