如何判断用户是访问"/Default.aspx"还是只是"/"?

15

我正在编写Global.asax.cs文件中的Application_BeginRequest部分。

出于SEO的目的,我正在尝试将正在查看以下内容的用户重定向:

http://www.example.com/Default.aspx

发送给:

http://www.example.com/

我的问题是:

我该如何知道用户正在查看哪个页面?我一直在使用以下代码:

HttpContext.Current.Request.Url.*

但是,无论我访问哪个参数,它们都是相同的。


你正在使用ASP.NET Routing吗?如果是的话,你的路由是什么样子的? - Russ Cam
我很好奇这如何有助于SEO,403不会惩罚你吗?无论如何,我相信一个httpmodule可以做到这一点..这是一个选择吗? - itchi
我正在尝试出于同样的原因做同样的事情 - 我被告知为同一页面拥有多个URL是不好的,所以我想要做的是检测对“/default.aspx”的请求并将其重定向到“/”。RickNZ的答案似乎有点复杂 - 我很想看看你是否有更简单的解决方案。 - Andy
10个回答

11

您可以使用以下代码获取用户在浏览器中输入的路径:

string path = Request.RawUrl;

MSDN


3
依我拙见,我建议您不要相信这种方法 - Request.RawUrl 返回的是根路径之外的任何内容(请参阅MSDN),包括查询字符串...并且它会在IIS在请求开始时完成任何重定向后发生。 我强烈建议您查看像RickNZ或Joshua等人的答案...您也可以尝试使用UrlRewrite模块。 - one.beat.consumer
1
Nichoas和Grant都是正确的 - Nicholas适用于.Net 4.0及以上版本;Grant适用于.Net 3.5及更早版本(至少根据我进行的快速测试)。 - Andy

4

4

我相信这个重定向是在IIS级别而不是应用程序逻辑内发生的,也许可以在IIS中关闭默认页面功能?


这也适用于动态内容。如果关闭默认文档模块,您只需要自己进行URL重写即可。 - usr
也许另一种处理方式是不要从IIS重定向到默认页面,而是重定向到一个虚拟页面,然后使用Server.Transfers跳转到Default.aspx。这样可以允许您暗示页面实际命中的URL以进行SEO优化。 - undefined

4

针对请求:

http://domain.com/

当在 HttpModule 中从 Begin_Request 事件引用时:

HttpContext.HttpRequest.Url.AbsolutePath == "/"
... Url.AbsoluteUri = "http://domain.com/"
... Url.LocalPath = "/"

如果您在Application_BeginRequest中没有看到这些值,则可能需要注册单独的HttpModule。Global.asax事件仅对托管的HttpHandlers调用,因此它们可能要等到IIS进行内部重定向(转移)到“/default.aspx”之后才会被调用。
您还可能需要在IIS中禁用默认文档处理,以便按照您感兴趣的方向工作(大多数站点将从/重定向到/default.aspx,而不是相反)。
编辑:另一个想法。在web.config中使用构建提供程序为新扩展名注册ASP.NET页面处理程序,可能是*.asph或类似的东西。然后将现有的default.aspx重命名为default.asph。接下来,在IIS的默认文件列表顶部添加default.asph,替换default.aspx。创建一个新的default.aspx文件,其代码后台的唯一功能是重定向到/。这应该可以解决问题。

2
如果您只关心SEO,那么您可以使用canonical“标签”。 如果您将此放置在Default.aspx页面中:
<link rel="canonical" href="http://www.mysite.com/" />

谷歌将始终索引您的网站。
http://www.mysite.com/Default.aspx

as

http://www.mysite.com/

防止两个页面被索引并在搜索结果中竞争。
你可以在这里阅读更多信息:http://googlewebmastercentral.blogspot.com/2009/02/specify-your-canonical.html

1

如果您请求http://www.site.com/,它会在您的代码运行之前重定向到http://www.site.com/default.aspx(这对所有浏览器都可见!)。

我认为这意味着检查HTTP-Referer的值将告诉您想要知道的内容。

如何获取HTTP Referer:在ASP.NET中获取HTTP Referrer

现在,如果用户访问了http://www.site.com,您的代码将看到http://www.site.com/default.aspx被调用,并且引用者是http://www.site.com。这并不告诉您他们来自哪里,但它确实告诉您他们直接访问了该网站。

在这里,您有一个优势,大多数搜索引擎都会遵循重定向并抓取实际页面,因此referer值可用于判断用户是否来自搜索引擎。但是,对于其他情况,最好遍历IIS日志。

请注意,由于ASP.NET基础设施将/重定向到/default.aspx,因此您无法将/default.aspx重定向到/而不创建无限循环。如果您想直接提供/,则需要在IIS前面放置一个shim。


检查引荐者对于你网站的第一个加载页面没有帮助,只有在第二次加载时才有用,此时它可能已经不再重要了。 - user743382
我明白你现在的尝试,但这假设/重定向到/Default.aspx。这并不一定会发生:典型的IIS配置不会从/到/Default.aspx进行客户端重定向,而是在请求/时直接加载和执行/Default.aspx。虽然可以将其设置为使您的答案起作用,但请考虑访问该站点的用户,被重定向到/Default.aspx,添加了书签,关闭了浏览器,重新打开了浏览器,访问了书签。书签将导致用户直接进入/Default.aspx,而无需先访问/。 - user743382
好的,那么我可能正在描述我有经验的任何配置,但这并不是我设置的,但它不一定是这样。 - Joshua

1

-1 是因为它不起作用。这个答案应该在其他答案下面。 - usr
我认为提供已知可行的答案非常重要,因为这样可以增加最大的价值。这也是 Stack Overflow 相对于 Google 的价值所在。 - usr
2
我取消了我的踩票。编辑:在您编辑帖子之前,我的投票已被锁定。 - usr

0

Request.url会给你当前在浏览器窗口中打开的URL。你可以用它来编写你想要的程序。

你也可以使用IIS来实现这一点。将Default.aspx设置为默认页面,每当有人打开你的网站时,地址就是www.yoursite.com\

如果你想要隐藏当前的URL不让用户看到,那么这并不建议,但你可以使用IIS的URL重写来实现。


0

要知道用户浏览器位置的最佳方法是通过JavaScript。

如果你想将所有人从Default.aspx重定向回www.mysite.com,你可以这样做:

$(document).ready(function() { 
 if(window.location.href == "http://www.mysite.com/Default.aspx")
  window.location.href = "http://www.mysite.com/"
});

注意:这依赖于 jQuery 的 $(document),但你可以理解其思想。

这并没有回答关于服务器端重定向的问题,也不会像问题中要求的那样对SEO有益。JavaScript重定向不会对SEO有益,反而可能会让用户感到沮丧,并干扰浏览器历史记录(你知道当你按返回键时,浏览器会跳回去吗?这对你的用户非常烦人!) - BenSwayne
它回答了问题的主题:“如何判断用户是访问/Default.aspx还是/”。 - voutmaster
他正在寻找C#的答案。此外,@BenSwayne是正确的,因为这不会对SEO产生好处,因为它是302临时重定向而不是301永久重定向。 - Derreck Dean
这回答了问题,但并没有涵盖问题描述中的SEO需求。此外,禁用JavaScript会完全关闭它。 - justinlabenne

0

使用路由和IIS重写模块的组合。您可能需要微调一下以适应尾部斜杠(是否需要)。我还将所有页面名称都设置为小写。使用此方法几乎可以确保您的default.aspx页面具有一致的301永久重定向,并符合SEO最佳实践。

在Global.asax中:

<%@ Import Namespace="System.Web.Routing" %>
<%@ Application Language="C#" %>

<script runat="server">

    void Application_Start(object sender, EventArgs e) 
    {
        RouteTable.Routes.MapPageRoute("default", string.Empty, "~/default.aspx");       
    }

然后在你的web.config文件中:

<rewrite>
  <rules>    
    <rule name="Default Document" stopProcessing="true">
      <match url="(.*?)/?default\.aspx$" ignoreCase="true" />
      <action type="Redirect" url="{R:1}/" redirectType="Permanent" />
    </rule>   
  </rules>
</rewrite>

如果您不熟悉路由,那么您可以通过以下链接访问主页:
<asp:HyperLink ID="homeLink" runat="server" NavigateUrl="<%$RouteUrl:RouteName=default %>">HOME</asp:HyperLink>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接