【问题标题】:Redirecting default.aspx to root virtual directory将 default.aspx 重定向到根虚拟目录
【发布时间】:2011-04-06 07:16:39
【问题描述】:

我有一个简单的 ASP.NET 3.5 应用程序在 IIS7 下的虚拟目录下运行。所以我的应用程序的 URL 就像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”。我该如何解决这个问题?

谢谢,

阿西夫

【问题讨论】:

    标签: asp.net redirect http-status-code-301 response.redirect


    【解决方案1】:

    这对我有用。 http://www.w3schools.com/asp/met_redirect.asp

    使用上面的链接,我写了以下几行,它执行没有任何问题。注意末尾没有分号。我的 default.aspx 页面只包含以下三行。

    <%
        Response.Redirect("~/portal")
    %>
    

    可能的原因是;通常在 .aspx 页面的顶部或 web.config 文件中会提到语言。如果没有提到语言,IIS 使用 VB.NET 编译页面,我们知道 VB.NET 不使用分号来终止语句。

    【讨论】:

      【解决方案2】:

      在您的 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>
      

      【讨论】:

      • 不要使用这种方法。如果您使用 JavaScript 重定向,搜索引擎不会接收到更改。
      【解决方案3】:

      我尝试了 URL 重写方法。 IE。这个:

          <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>
      

      【讨论】:

        【解决方案4】:

        处理子目录和维护 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();
        }
        

        【讨论】:

          【解决方案5】:

          由于你使用的是 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>
          

          这只是一个简单的示例,您可以根据需要对其进行修改。希望这会有所帮助!

          【讨论】:

          • 实际上我不能通过 IIS7 做到这一点,我必须使用代码本身来做到这一点。
          【解决方案6】:

          只要您没有子目录,上面的代码就可以正常工作。 AFAIK,它是 ASP.NET 中的一个错误:当 URL 没有该扩展名时,Request.RawUrl 不应包含“/default.aspx”。我已经测试了您的代码,它在没有子目录的情况下也能正常工作,但是如果 default.aspx 在目录下,则 Request.RawUrl 对象无法摆脱 default.aspx 从而导致无限循环。

          【讨论】:

            猜你喜欢
            • 2013-04-01
            • 2017-06-02
            • 2018-08-14
            • 2013-07-30
            • 1970-01-01
            • 2011-12-26
            • 2017-03-17
            • 2011-02-12
            • 2011-12-15
            相关资源
            最近更新 更多