Azure App Service中Apache重定向自定义域名无法保留路径
问题描述
本地测试时.htaccess规则运行正常,但部署到Azure App Service后出现以下异常:
- 通过自定义域名(如
customdomain.com/foo/content/bar)访问时,重定向至newdomain.com无法保留路径 - 使用Azure默认域名(
something-some-prod.azurewebsites.com)访问时,路径可正常保留
旧域名的.htaccess规则示例:
RewriteRule "^/?foo/foo/content/bar/content2/?$" "https://www.newdomain.com/foo/foo/" [L,R=301,NE]
注:旧域名上上述内容已不存在,因此强制保留
foo/foo部分。
末尾的通用重定向规则:
RewriteRule "^/?(.*)" "https://www.newdomain.com/$1" [L,R=301,NE]
新增信息:新域名主机的.htaccess内容如下:
RewriteEngine On # Handle URL Canonicalization RewriteCond %{HTTP_HOST} ^old-domain.com$ [NC] RewriteRule ^(.*)$ https://www.old-domain.com/$1 [L,R=301] RewriteCond %{HTTP_HOST} ^new-domain.com$ [NC] RewriteRule ^(.*)$ https://www.new-domain.com/$1 [L,R=301] # Handle Authorization Header RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # Redirect Trailing Slashes If Not A Folder... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] # Handle Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L]
原因分析
- Azure代理的路径传递差异:自定义域名访问时,Azure的前端反向代理会修改请求头与路径变量(如
REQUEST_URI),导致.htaccess中依赖捕获组的规则无法正确匹配原始路径;而默认域名访问时没有经过额外代理层,路径变量保持完整。 - 通用规则的捕获组失效:旧域名的通用规则
^/?(.*)在Azure环境下,可能因为代理传递的路径格式变化,导致捕获的$1为空或不完整,最终重定向时丢失路径。 - 新域名的二次重定向干扰:若旧域名重定向到新域名时未带
www前缀,会触发新域名的规范重定向规则,虽然规则里保留了$1,但如果第一次重定向传递的路径本身已出错,就会导致最终路径丢失。
解决方案
调整旧域名的.htaccess规则
1. 替换通用重定向规则
直接使用%{REQUEST_URI}变量获取完整原始路径,避免捕获组匹配错误:
RewriteRule ^ https://www.newdomain.com%{REQUEST_URI} [L,R=301,NE]
这种方式跳过捕获组,直接读取代理传递的完整请求路径,适配Azure环境的路径格式。
2. 调整特定重定向规则
将特定规则改为基于REQUEST_URI的匹配,确保不受代理影响:
RewriteCond %{REQUEST_URI} ^/?foo/foo/content/bar/content2/?$ RewriteRule ^ https://www.newdomain.com/foo/foo/ [L,R=301,NE]
Azure App Service配置调整
在Azure App Service的「配置」-「常规设置」中,确保ARR Affinity设置为On,避免代理请求的路径被异常截断。
优化新域名的.htaccess(可选)
合并域名规范重定向规则,减少二次重定向的潜在影响:
# 合并域名规范重定向 RewriteCond %{HTTP_HOST} ^(old-domain\.com|new-domain\.com)$ [NC] RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [L,R=301]
该规则自动将裸域名转换为带www的版本,同时确保路径$1正确传递。
内容的提问来源于stack exchange,提问作者csaba
相关产品推荐
相关产品推荐

