我有一个在IIS7下在虚拟目录下运行的简单ASP.NET 3.5应用程序。所以我的应用的网址就像http://example.com/app。我想301将请求重定向到example.com/app/default.aspx到example.com/app以获得更好的SEO。我必须通过代码重定向,而不是通过任何IIS设置。我无法通过本文中提到的代码执行此操作:
http://www.4guysfromrolla.com/articles/072810-1.aspx
代码:
if (request.RawUrl.Equals("/default.aspx"))
{
newUrl = string.Format("{0}://{1}{2}",
request.Url.Scheme,
request.Url.Authority,
request.RawUrl.Remove(request.RawUrl.LastIndexOf("/default.aspx", StringComparison.OrdinalIgnoreCase)));
context.Response.Status = "301 moved permanently";
context.Response.AddHeader("Location", newUrl);
}
当应用程序位于虚拟目录下时,似乎进入无限循环。即使在301重定向导致无限循环之后,request.RawUrl属性也总是返回“/default.aspx”。我该如何解决这个问题?
感谢,
阿西
答案 0 :(得分:2)
只要您没有子目录,上述代码就可以正常工作。 AFAIK,它是ASP.NET中的一个错误:当URL没有该扩展时,Request.RawUrl不应包含“/default.aspx”。我已经测试了你的代码,它没有子目录就可以工作,但是如果default.aspx在一个目录下,那么Request.RawUrl对象就无法摆脱default.aspx,从而无法循环。
答案 1 :(得分:1)
轻微修改以处理子目录并维护url变量。可能存在更好的比较和替换功能,但这适用于IIS 7。
if (Request.RawUrl.ToLower().Contains("/default.aspx")) // use Contains instead of EndsWith to handle url vars
{
string newUrl = string.Format("{0}://{1}{2}",
Request.Url.Scheme,
Request.Url.Authority,
Request.RawUrl.ToLower().Replace("default.aspx", "")); // don't remove the trailing slash so url vars are maintained
Response.Clear();
Response.Status = "301 Moved Permanently";
Response.AddHeader("Location", newUrl);
Response.End();
}
答案 2 :(得分:1)
我尝试了URL Rewrite方法。即这一个:
<rule name="default page" stopProcessing="true">
<match url="^default\.aspx$" />
<action type="Redirect" url="{R:0}" redirectType="Permanent" />
</rule>
但它在无限重定向循环中发送了我的浏览器。我将其修改为以下内容并且工作正常:
<rule name="default page" stopProcessing="true">
<match url="(.*)default.aspx$" />
<action type="Redirect" url="{R:1}" redirectType="Permanent" />
</rule>
答案 3 :(得分:0)
由于您使用的是IIS7,请尝试以下操作:
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="default page" stopProcessing="true">
<match url="^default\.aspx$" />
<action type="Redirect" url="{R:0}" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
这只是一个简单的示例,您可以根据需要进行修改。希望这有帮助!
答案 4 :(得分:0)
这对我有用。 http://www.w3schools.com/asp/met_redirect.asp
使用上面的链接,我写了以下几行,并且执行没有任何问题。请注意,最后没有分号。我的default.aspx页面只包含以下三行。
<%
Response.Redirect("~/portal")
%>
可能的原因是;通常在.aspx页面的顶部或web.config文件中提到语言。如果没有提到语言,IIS使用VB.NET编译页面,我们知道VB.NET不使用分号来终止语句。
答案 5 :(得分:-1)
在default.aspx页面中使用此代码
<script language="javascript">
var url=location.href;
if (url.toLowerCase()=="http://www.doamin.com/default.aspx" || url.toLowerCase()=="http://www.doamin.com/#") {
window.location= "http://www.doamin.com";
}
</script>