如何產生靜態網頁以及使用urlwrite達到SEO效果

雖然現在大部份的網站已有很豐富的資料,且都利用資料庫及程式來架構,但有時候受限於虛擬主機的cpu及記憶
體限制,很多人還是會選擇以靜態網頁方式來建置網站,那有什麼方法可以兩全其美能夠保持靈活的架構又兼顧
主機的種種限制呢?在這裡我們選擇保留程式架構,但最後輸出成靜態網頁的方式來做.


 
file structure
左側的圖片為網站的目錄結構,"Static"為輸出靜態網頁的目錄,
"HtmlStaticOutput.aspx"則為我們以下要討論的程式,我們的目標是
把Page1~3的動態程式輸出為靜態網頁.

另外不要忘了在Static目錄增加IIS_IUSRS權限,否則檔案會無法寫入.

首先我們要建立一個網址陣列, 我們要先知道我們的網站有那些網址需要輸出成靜態網頁,你可以手動建立一個陣列把
網址填進去,或是你的網站建構已有建立資料庫,那你就可以從資料庫直接抓出來.
在這裡我們選擇建立一個字串陣列,並把Page1~3都加入陣列.
string[] Urls = new string[] {  
        "http://192.168.1.1/Page1.aspx", "http://192.168.1.1/Page2.aspx",
        "http://192.168.1.1/Page3.aspx"
    };
接下來我們利用WebClient類別來抓取網頁內容.
void DoFetch(string url)
{
    string SavePath = "Static";
    string FileName = Path.GetFileName(url).Replace("aspx", "html");
    string result;

    WebClient wc;

    try
    {
        using (wc = new WebClient())
        {
            using (Stream s = wc.OpenRead(url))
            {
                using (StreamReader sr = new StreamReader(s))
                {
                    result = sr.ReadToEnd();
                    sr.Close();
                }
            }
        }

        string PhysicalPath = Server.MapPath(SavePath);
        PhysicalPath = Path.Combine(PhysicalPath, FileName);

        using (StreamWriter sw = new StreamWriter(PhysicalPath, false, Encoding.UTF8))
        {
            sw.WriteLine(result);
            sw.Close();
        }
    }
    catch (Exception ex)
    {
        Response.Write(ex.Message);
    }
}

首先我們建立了SavePath做為變數,用來指定輸出要儲存的靜態網頁目錄,接著就用WebClient.OpenRead去抓取
指定的網內容並儲存到變數裡,接著再把內容用StreamWriter儲存到"Static"目錄裡,如此就產生了靜態網頁.


靜態網頁產生之後的另一個問題就是,要如何在不變動任何的檔案架構下,讓使用者可以讀取靜態網頁的內容.
在這裡我們可以用IIS裡的URLrewrite模組來做, 完成後加入到Web.config裡.
<rewrite>
    <rules>
        <rule name="Redirect To Static HTML" stopProcessing="true">
            <match url="^(.*).html$" />            
            <action type="Rewrite" url="static/{R:1}.html" />
        </rule>
    </rules>
</rewrite>

我們把所有對.html的請求,都直接導到static目錄裡,這樣一來不僅可以保留網站的原始架構,你還是可以照以前請求
.aspx的方式瀏覽網站,也可以用請求.html的方式以靜態網頁來瀏覽網站.
如: http://192.168.1.1/Page1.aspx 及 http://192.168.1.1/Page1.html
都可以瀏覽到同一頁面的內容.

HtmlStaticOutput.aspx.cs Expand
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text;
using System.Net;
using System.IO;

public partial class HtmlStaticOutput : System.Web.UI.Page
{
    string[] Urls = new string[] {  
        "http://192.168.1.1/Page1.aspx",
        "http://192.168.1.1/Page2.aspx",
        "http://192.168.1.1/Page3.aspx"
    };

    protected void Page_Load(object sender, EventArgs e)
    {
        for (int i = 0; i < 1; i++)
        {
            DoFetch(Urls[i]);
        }
    }

    void DoFetch(string url)
    {
        string SavePath = "Static";
        string FileName = Path.GetFileName(url).Replace("aspx", "html");
        string result;

        WebClient wc;

        try
        {
            using (wc = new WebClient())
            {
                using (Stream s = wc.OpenRead(url))
                {
                    using (StreamReader sr = new StreamReader(s))
                    {
                        result = sr.ReadToEnd();
                        sr.Close();
                    }
                }
            }

            string PhysicalPath = Server.MapPath(SavePath);
            PhysicalPath = Path.Combine(PhysicalPath, FileName);

            using (StreamWriter sw = new StreamWriter(PhysicalPath, false, Encoding.UTF8))
            {
                sw.WriteLine(result);
                sw.Close();
            }
        }
        catch (Exception ex)
        {
            Response.Write(ex.Message);
        }
    }
}
comments powered by Disqus