无法重定向到 MVC 控制器中的外部 URL

Posted

技术标签:

【中文标题】无法重定向到 MVC 控制器中的外部 URL【英文标题】:Unable to redirect to external URL in MVC controller 【发布时间】:2019-01-14 08:33:59 【问题描述】:

我正在尝试将 atom 支付网关集成到我的 MVC 项目中。即使在启用 CORS 之后,我也遇到了这个令人讨厌的错误。所以我想也许是导致问题的返回网址。所以我写了一个简单的重定向来找出真正的原因return Redirect("https://google.com");,但我仍然遇到同样的错误。我做错了什么?

  public ActionResult TransferFund()
         
        return Redirect("https://google.com");
     

Failed to load https://google.com/: Response to preflight request doesn't pass 
access control check: No 'Access-Control-Allow-Origin' header is present on the requested 
resource. Origin 'http://localhost:25850' is therefore not allowed 
access. The response had HTTP status code 405.

我已关注This 重定向

编辑

<script type="text/javascript">
    $(document).ready(function () 


            $('#btnatom').on('click', function () 
                $.ajax(
                    type: 'POST',
                    url: "/AtomPayment/TransferFund",
                    data: ,
                    dataType: "text",
                    success: function (resultData)  alert("Save Complete") 
                );
            );
        );


    </script>
    [HttpPost]
    public ActionResult TransferFund()
    

        return new RedirectResult("http://google.com");
        string strURL, strClientCode, strClientCodeEncoded;
        ....
    

【问题讨论】:

Redirect to external URI from ASP.NET MVC controller的可能重复 @kgbph 那是怎么重复的?我确实写了同一行代码,但我收到了这个错误。 我可以假设您使用的是 POST(来自 js 的 ajax),而不是 GET,这就是它可能是跨域请求的原因。 这是一个重复的问题。也许接受的答案对您不起作用。我会尽力帮助你的。 @Yara TransferFund 是我通过 Jquery ajax 方法调用的 POST 方法。我刚刚发现 return Redirect("https://google.com"); 来自 get 操作方法,但不能从作为 post 方法的内部操作方法工作。我正在尝试从 POST 操作方法发出 GET 请求 【参考方案1】:

以防万一有人需要:

首先将您的另一个“http://example.com”重定向到另一个没有 httpMethod 的控制器(“RedirectController”)

[HttpPost]
public IActionResult TransferFund()
   Return Redirect("redirect?url=http://example.com");

现在:

RedirectController.cs

RedirectController()
  public IActionResult Indext()
     var url = Request.Query["url"];
     Return Redirect(url);
  

或者我们可以重定向到当前控制器 btw

【讨论】:

【参考方案2】:

让我们深入了解错误:

无法加载https://google.com/:对预检请求的响应 未通过访问控制检查:没有“Access-Control-Allow-Origin” 请求的资源上存在标头。起源 'http://localhost:25850' 因此不允许访问。这 响应的 HTTP 状态代码为 405。

您遇到了Cross Domain request 问题。

出于安全原因,Google 拒绝您访问其服务器。无论您发出POSTGET 请求,google 无法识别您的域并阻止您的跨域请求

如果您使用 jquery,它会起作用,是的,因为您使用 java 脚本的 window.location 属性从客户端到客户端发出请求。

如果您想从您的控制器代码中重定向结果,您需要使用本地域中的地址,该地址将接受请求并且不会拒绝它。

您可以在此处阅读有关Error 405 的更多信息。

意思是:

管理员可以配置每个 Web 服务器,以便个人 方法要么允许要么不允许。例如,如果没有 网站上的交互式内容,POST 是唯一合乎逻辑的 方法是不允许的,因为用户没有选项可以输入自己的 数据并将其发送到服务器。否则,提到的错误信息 上面会出现状态码 405,通知浏览器和 它的用户认为该方法是不允许的。

【讨论】:

【参考方案3】:

由于“POST”方法,您无法在“TransferFund”方法中进行重定向。从 jquery 做。这里更正了代码:

<script type="text/javascript">
    $(document).ready(function () 


            $('#btnatom').on('click', function () 
                $.ajax(
                    type: 'POST',
                    url: "/AtomPayment/TransferFund",
                    data: ,
                    dataType: "text",
                    success: function (resultData)  
                        if(resultData == "Ok")
                            alert("Save Complete");
                            window.location = "https://google.com/"
                        
                    
                );
            );
        );
</script>

[HttpPost]
public ActionResult TransferFund()

    //do some transfer work
    return Content("Ok");

【讨论】:

以上是关于无法重定向到 MVC 控制器中的外部 URL的主要内容,如果未能解决你的问题,请参考以下文章

.net MVC 重定向与 JWT 令牌

IdentityServer 4,OpenIdConnect 重定向到外部登录 url

使用 web.config 中的 httpRedirect 将 asp.net MVC URL 重定向到特定的控制器/操作/参数

从 ASP.NET MVC 控制器重定向到外部 URI

在 ASP.Net MVC3 中重定向到不影响 URL 的区域

Cordova 无法将 URL 重定向到外部服务器