此网页在执行Response.RRedirect(Request.RawUrl)时有一个重定向循环
本文关键字:RawUrl 有一个 循环 重定向 Request 网页 执行 Response RRedirect | 更新日期: 2023-09-27 18:21:20
我搜索过这里和其他网页,但没有找到问题的答案。
我试图实现的是,如果用户在国家A
和国家B
之间切换,语言会切换,但我没有将它们返回到主页,而是将它们重定向到它们所在的同一页面(使用更新的语言)。然而,对我来说,棘手的是,如果用户在国家A
和国家C
或D
之间切换,我们确实希望将它们返回到主页。因此,只有在A
和B
之间切换的情况下,我才希望重定向到同一页面(我的语言切换功能很好,我只是在不同的场景中重定向有问题。)
我的方法是这样的:
[HttpGet]
public ActionResult SetLanguage(string languageId)
{
var currentCulture = GetCurrentCulture(); //Gets the current language for a user
if ((currentCulture == "A" || currentCulture == "B")
&& (languageId == "A" || language == "B"))
{
// Set culture to use chosen language/culture
CultureService.SaveCulture(HttpContext.Response, languageId);
Response.Redirect(Request.RawUrl);
}
else
{
CultureModule.SavePreferredCulture(HttpContext.Response, languageCode);
}
return RedirectToAction("Index", "Home", new { culture = languageId });
这导致Chrome中出现此错误:
此网页有一个重定向循环
调试时,我似乎有一个无限循环,但我不明白为什么/如何,也不知道如何解决这个问题。
以下是我尝试更改的内容:Response.Redirect(Request.RawUrl);
尝试,return
尝试,但这不起作用,所以我尝试使用其他Redirect
选项,如RedirectPermanent
和其他选项。我在这方面运气不好,我已经有一段时间没有玩过这样的游戏了,所以我在这里对自己做错的事情感到不知所措。
我相信我需要一个return
来代替Response.Redirect(Request.RawUrl);
,但我试过玩上面的东西,但我什么都做不到。
如果你需要任何其他代码或其他详细信息,请告诉我,我会更新帖子。
谢谢你的帮助!
这个错误(浏览器的客户端错误)意味着你会无限地重定向到同一个页面。
我认为你试图检查重定向到同一页面的是:
if((currentCulture == "A" && languageId == "B") || (currentCulture == "B" && languageId == "A"))
您可以尝试使用Request.Url.AbsolutePath来避免在重定向过程中再次传递查询字符串。Request.RawUrl包含查询字符串,其中可能传递了languageId。
不要使用这种方法。编辑路由配置并将语言添加到路由中。使您的控制器继承自新的基本控制器。在基本控制器中重写开始执行时的。在那里阅读你的路线价值并设定文化。
我最终通过对URL进行一些欺骗来解决这个问题。
TLDR:我使用Request.UrlReferrer.Authority
获取URL,并使用string.Replace("A","B")
交换URL中的语言代码。
如果正常的url是这样的:
http://localhost:0000/EN/Product/Shirt
我想实现重定向到同一个页面,但我想要的不是EN
,而是FR
或用户设置的任何语言。
因此,新的URL需要看起来像这样:
http://localhost:0000/FR/Product/Shirt
为了实现这一点,我这样做了:
if ((currentCulture == "A" || currentCulture == "B") && (languageId == "A" || language == "B"))
{
var urlReferrer = this.Request.UrlReferrer;
if (urlReferrer != null)
{
var currentUrl = urlReferrer.PathAndQuery;
var url = "https://" + Request.UrlReferrer.Authority;
if ((currentCultureUI == A) && (languageCode == B))
{
var aToBPathAndQuery = currentUrl.Replace("A", "B");
return Redirect(url + aToBPathAndQuery);
}
var bToAPathAndQuery = usersCurrentUrl.Replace("B", "A");
return Redirect(url + bToAPathAndQuery);
}
A
和B
都是包含在资源文件中的字符串,所以我对其进行了更改,以节省问答中的空间,并使事情变得更简单。现在,如果这些值发生了更改,则可以在资源文件中更改一次,并且可以继续使用。它们可以换成A = "English"
和B = "Spanish"