使用 Apache SSI(Server Side Includes) 為靜態網頁統一頁面佈局

来源:https://www.cnblogs.com/jacklondon/archive/2020/04/27/static_page_layout_using_apache_server_side_includes.html
-Advertisement-
Play Games

當我們搭建一個靜態網站時,我們經常會有這樣的想法:希望所有頁面,有風格一致的頭部菜單、標題/廣告欄、頁腳。 ... 其實, Apache SSI(Server Side Includes) ,可以做到靜態網頁統一頁面佈局,可以自動地為每個網頁添加風格一致的頭部菜單、標題/廣告欄、頁腳。 ...


當我們搭建一個靜態網站時,我們經常會有這樣的想法:希望所有頁面,有風格一致的頭部菜單、標題/廣告欄、頁腳。

 

當然了,也有一些網頁開發工具,比如,Adobe Dreamweaver, 自帶此功能。其實現方法是:

將可在多個頁面重覆使用的頁面部分,獨立出來,稱之為“庫(library)”,這可以理解為軟體開發中的“組件”;

在每個需要的網頁中,增加此庫/組件,Adobe Dreamweaver工具將此庫的 HTML 源代碼複製到此網頁中,併在前後增加標簽定位字元(有開始、結束),並註釋說明,不要手工更改標簽定位字元內部的內容;

單個網頁可添加多個庫/組件;

當某個庫/組件有變化時,Adobe Dreamweaver工具根據標簽定位符,找到所有網頁中的對應標簽定位字元,將其中的內容,進行批量替換

 

Adobe Dreamweaver 這種功能,當然高級,只不過,同類網頁編輯軟體,支持此功能的極少見。

 

其實, Apache SSI(Server Side Includes) ,可以做到靜態網頁統一頁面佈局,可以自動地為每個網頁添加風格一致的頭部菜單、標題/廣告欄、頁腳。

這裡面用到 Apache HTTP Server 的兩個技術:

a) .htaccess 文件

b) shtml ,即簡單的動態網頁編程語言。

 

詳細如下:

1. 在靜態網頁目錄下,創建 .htaccess 文件,內容為:

SSILegacyExprParser on
RewriteRule ^(en.us|zh.cn)/(.*)$ /layout.shtml?language=$1&page_file_name=$2

 

意思是,

當用戶使用瀏覽器訪問 http://localhost:81/zh-cn/page_a.htm 的時候,Apache HTTP Server 內部使用 http://localhost:81/layout.shtml?language=zh-cn&page_file_name=page_a.htm 來生成靜態頁面,

當用戶使用瀏覽器訪問 http://localhost:81/zh-cn/page_b.htm 的時候,Apache HTTP Server 內部使用 http://localhost:81/layout.shtml?language=zh-cn&page_file_name=page_b.htm 來生成靜態頁面,

當用戶使用瀏覽器訪問 http://localhost:81/zh-cn/page_c.htm 的時候,Apache HTTP Server 內部使用 http://localhost:81/layout.shtml?language=zh-cn&page_file_name=page_c.htm 來生成靜態頁面.

瀏覽器上的網址不會變化。

 

這裡的 layout.shtml ,就是統一頁面佈局頁面。

 

2. layout.shtml 文件,本質是靜態網頁,加上一點 SSI 標簽。內容為:

 1 <html class="no-js" lang="zh-CN" dir="ltr">
 2   <head>
 3     <title>上海折桂軟體有限公司</title>
 4     <meta name="description" content="上海折桂軟體有限公司"  />
 5     <meta name="keywords" content="上海折桂軟體有限公司, 下載, 文件下載"  />
 6 </head>
 7 <body>
 8     title block;
 9     <br/>
10 
11 <!--#set var="var_language" value="" -->
12 <!--#set var="var_page_file_name" value="" -->
13 <!--#if expr='${QUERY_STRING} = /^language=(.*)&page_file_name=(.*)$/' -->
14     <!--#set var="var_language" value="$1" -->
15     <!--#set var="var_page_file_name" value="$2" -->
16 
17     <!--#include virtual="/${var_page_file_name}" -->
18 <!--#else -->
19 <!--#endif -->
20 
21     <br/>
22     footer block;
23 </body>
24 </html>

以上代碼,第 11-15 行,將網址中的參數,使用正則表達式,提取到變數 var_language, var_page_file_name 中。

如果網址是:http://localhost:81/zh-cn/page_a.htm ,提取到的變數為  var_language = "zh-cn", 而 var_page_file_name 為 "page_a.htm"。

 

第17行代碼,則是將 page_a.htm 的網頁內容,讀取,填充到有頁頭、頁尾的臨時頁面中間,拼合成一個完整網頁,輸出給用戶的瀏覽器。

 

這樣,當用戶使用瀏覽器訪問 http://localhost:81/zh-cn/page_a.htm 的時候,得到:

title block;
page_content_a;
footer block; 

 

當用戶使用瀏覽器訪問 http://localhost:81/zh-cn/page_b.htm 的時候,得到:

title block;
page_content_b;
footer block; 

 

在開發 page_a.htm 及 page_b.htm 時,並不用考慮頁頭、頁尾。

因為 .htaccess 文件 、layout.shtml 會合作,自動在輸出頁面前,補出頁頭、頁尾,從而實現了靜態網頁統一頁面佈局的目的。

 

美工也省事很多,只需要修改 layout.shtml 一個文件,即可實現整個網站的風格升級。

 

----------------備註:

使用 SSILegacyExprParser on ,是因為最新版 Apache 的這一部分正則表達式解析有 bug, 但它相容老版本的正則表達式格式。

詳細見:

Bug 57448 - SSI <!--#set --> cannot capture backreferences from regex match in <!--#if -->
https://bz.apache.org/bugzilla/show_bug.cgi?id=57448

Get parts of DOCUMENT_URI using regex and SSI
https://stackoverflow.com/questions/41977344/get-parts-of-document-uri-using-regex-and-ssi

 

-------歡迎轉載,轉載請註明出處:https://www.cnblogs.com/jacklondon/ 。也歡迎訪問: http://www.zheguisoft.com .


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Emmet是一個快捷編寫html元素、css樣式的插件,很多主流IDE都自帶得有。 沒有的話,可以自己給IDE裝上該插件。 輸入命令後,按Tab執行。 html ! 生成html文檔基本骨架 link:css 生成引入css的<link /> link:favicon 生成設置網頁圖標的<link ...
  • JavaScript實現放大鏡效果: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0 ...
  • 恢復內容開始 Vue.js 腳手架vue-cli傻傻的分不清楚 B站視頻地址:https://www.bilibili.com/video/BV1n7411T78U node.js >>npm(git, maven) 完整的生態圈 --> 下載其他模塊 下載webpack 3.0和4.0版本 手動搭 ...
  • 前端節流經常在項目監聽頁面滾動的時候用到,就是在一段時間內,只執行一次話不多說,看代碼 function throttle(func, deley) { let run = true,timer; return function () { if (!run) return; run = false; ...
  • 因為js是單線程的,所以一旦代碼中有報錯,就不會執行下麵的了,如下333就未列印 console.log(111)throw Error(222)console.log(333) 好像與promise沒關係,哈哈。 1.傳說中的 setInterval 與 setTimeout它們是單獨的線程執行計 ...
  • ```css.clearfix:after, .clearfix:before { content: " "; display: table;}.clearfix:after { clear: both;}.clearfix{zoom:1;/*為IE6,7的相容性設置*/}``` ...
  • store文件如下 1.modules下文件是模塊化的劃分,裡面的js有state,action,mutations.然後通過 export default { namespaced: true, state, mutations, actions} 方式導出。 2.index.js中導出的格式如下 ...
  • 一、緣起: 在webpack打包的配置文件總是遇到‘__dirname’(例如下麵這個),作為一個從事前端多年的‘老白’一直對它都是用不著,就不管的態度,但出來混總是要還的>_<...所以做了這個小總結 Node.js path 模塊提供了一些用於處理文件與目錄的路徑的實用工具。 它可以使用以下方式 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...