2010-11-09 45 views
1

我正在处理某些使用Windows服务器的客户端,因此不支持.htaccess文件。这不是一个大问题,但是,我关心的是:Windows Server Redirect问题

我在.htaccess文件中设置了一个规则,将网站的非www版本重定向到www版本。这使得URL看起来更好,并防止重复的内容被索引。

但是,在Windows服务器上似乎没有这样简单的方法。我已阅读了关于设置web.config文件的教程,但是,我的Windows服务器体验非常有限,并且很多时候我只能通过FTP访问该站点(无服务器访问)。

任何关于快速和相当简单的解决方案的想法,我可以使用?

回答

1

创建的web.config(在根目录)与下一个内容文件:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true" /> 
     <rewrite> 
      <rules> 
       <rule name="CanonicalHostNameRule" stopProcessing="true"> 
        <match url="(.*)" /> 
        <conditions> 
         <add input="{HTTP_HOST}" pattern="^www\.domain\.com$" negate="true" /> 
        </conditions> 
        <action type="Redirect" url="http://www.domain.com/{R:1}" /> 
       </rule> 
      </rules> 
     </rewrite> 
    </system.webServer> 
</configuration> 

URL Rewrite Module(至少2.0版)中,必须安装。

+0

这对于其中一个网站非常有用!但是,它不适用于另一个。如果他们没有安装URL重写模块会怎么样? – Batfan 2010-11-09 20:48:23

+1

尝试协调重写模块的安装 - 这是一般接受的扩展。另一方面,你可以编写自己的模块 - 这非常简单(如果你需要支持,我可以为你写明天)。 – Matej 2010-11-09 22:15:22

+0

这真的很友善,但我甚至不熟悉如何添加模块/扩展。 – Batfan 2010-11-09 22:17:06

1

要使用自定义模块文件夹App_Code创建文件CanonicalRedirectModule.cs它与一个内容的网站应用程序的根文件夹:

using System; 
using System.Web; 

public class CanonicalRedirectModule : IHttpModule 
{ 
    public const string configKeyCanonicalHostName = "CanonicalHostName"; 

    private string configCanonicalHostName; 

    #region IHttpModule Members 

    public void Dispose() 
    { 
    } 

    public void Init(HttpApplication context) 
    { 
     this.configCanonicalHostName = System.Configuration.ConfigurationManager.AppSettings[configKeyCanonicalHostName]; 

     if (string.IsNullOrEmpty(this.configCanonicalHostName)) 
     { 
      System.Diagnostics.Trace.TraceWarning("Can't find application setting {0} in configuration file (/configuration/appSettings/add/...).", configKeyCanonicalHostName); 
//#if !DEBUG 
//   return; 
//#endif 
     } 

     context.BeginRequest += new EventHandler(context_BeginRequest); 
    } 

    #endregion 

    void context_BeginRequest(object sender, EventArgs e) 
    { 
     HttpApplication app = (HttpApplication)sender; 
     if (app.Request.Url.Host != this.configCanonicalHostName) //&& !app.Request.IsLocal 
     { 
      UriBuilder newUrl = new UriBuilder(app.Request.Url); 
      newUrl.Host = this.configCanonicalHostName; 

      app.Response.Redirect(newUrl.ToString(), true); 
     } 
    } 
} 

然后在web.config配置模块:

<?xml version="1.0"?> 

<system.web> 
    <!-- Configuration for classic pipeline mode --> 
    <httpModules> 
    <add name="CanonicalRedirectModule" type="CanonicalRedirectModule"/> 
    </httpModules> 
</system.web> 

<system.webServer> 
    <!-- Configuration for integrated pipeline mode --> 
    <validation validateIntegratedModeConfiguration="false" /> 
    <modules runAllManagedModulesForAllRequests="true" > 
    <add name="CanonicalRedirectModule" type="CanonicalRedirectModule"/> 
    </modules> 
</system.webServer> 

+0

这似乎并不奏效。我复制出模块给它正确的名称,并把它放在一个名为App_Code的文件夹中(在根目录中)。然后我把上面的web.config放在根目录下。我错过了什么吗?谢谢 – Batfan 2010-11-10 18:44:50

+1

请提供有关服务器环境(IIS版本,ASP.NET版本)的更多信息 – Matej 2010-11-10 18:49:47

+0

那就是事情,我无法找到答案。我只能通过FTP访问。 – Batfan 2010-11-10 22:32:51