2010-11-09 88 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