You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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]
原因分析
  1. Azure代理的路径传递差异:自定义域名访问时,Azure的前端反向代理会修改请求头与路径变量(如REQUEST_URI),导致.htaccess中依赖捕获组的规则无法正确匹配原始路径;而默认域名访问时没有经过额外代理层,路径变量保持完整。
  2. 通用规则的捕获组失效:旧域名的通用规则^/?(.*)在Azure环境下,可能因为代理传递的路径格式变化,导致捕获的$1为空或不完整,最终重定向时丢失路径。
  3. 新域名的二次重定向干扰:若旧域名重定向到新域名时未带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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 09:17:10