Azure中启用仅HTTPS重定向后,ASP.NET MVC应用仍提示「The requested resource can only be accessed via SSL」的问题咨询
可能的原因分析
这种情况本质是部分HTTP请求没有被Azure网关的重定向规则拦截,直接穿透到了你的ASP.NET MVC应用层,触发了应用本身的SSL强制检查逻辑,从而抛出这个错误。具体场景通常有这些:
应用层提前配置了SSL强制规则:比如你在
web.config里设置了<system.webServer><security><access sslFlags="Ssl" /></security></system.webServer>,或是在Global.asax/自定义ActionFilter里加了SSL校验逻辑。Azure App Service的HTTPS重定向是网关层面的,但如果应用自身的SSL检查优先级更高(或某些请求绕过了网关规则),就会直接触发应用内的错误。不遵循重定向的客户端/爬虫:有些老旧客户端、爬虫或者测试工具在收到301/302重定向响应后,不会自动转向HTTPS,而是持续发送HTTP请求到你的应用。这类请求会直接抵达应用层,触发SSL强制错误。
CORS预请求(OPTIONS方法):如果你的应用处理跨域请求,浏览器会先发送HTTP的OPTIONS预请求。默认情况下,Azure的HTTPS重定向规则可能不会拦截OPTIONS请求(或是你的重定向规则没覆盖OPTIONS方法),导致这个预请求直接到达应用,触发SSL检查错误。
重定向规则配置遗漏:检查Azure App Service的重定向规则是否覆盖了所有HTTP方法。比如有些规则可能只针对GET请求,忽略了POST/PUT等其他方法,这类请求会绕过重定向,直接触发应用内的错误。
如何模拟这个事件
你可以用以下几种方式复现这个错误:
使用curl发送不跟随重定向的HTTP请求:
在终端执行命令:curl -v http://myapp.mydomain.com这个命令不会自动跟随重定向,会直接发送HTTP请求到应用,你的
Application_Error()方法应该能捕获到对应的错误。使用Postman发送HTTP请求并关闭自动重定向:
打开Postman,新建GET请求并输入http://myapp.mydomain.com,然后在请求设置里关闭「Follow Redirects」选项,发送请求后就能触发应用内的SSL错误。模拟CORS预请求:
用curl发送OPTIONS请求:curl -X OPTIONS http://myapp.mydomain.com -H "Origin: https://another-domain.com"如果你的重定向规则没覆盖OPTIONS方法,这个请求会直接到达应用,触发错误。
编写简单的控制台程序发送HTTP请求:
写一段C#代码,直接发送HTTP请求并不处理重定向:using System.Net; var request = (HttpWebRequest)WebRequest.Create("http://myapp.mydomain.com"); request.AllowAutoRedirect = false; // 禁用自动重定向 try { using (var response = (HttpWebResponse)request.GetResponse()) { Console.WriteLine($"Status code: {(int)response.StatusCode}"); } } catch (WebException ex) { Console.WriteLine(ex.Message); }运行这段代码,你的
Application_Error()方法就能捕获到目标错误。
内容的提问来源于stack exchange,提问作者markzzz

