標題:「水坑」略深入的講解偽靜態相關的知識
日期:2021-12-08 22:56:36
標籤:
- GesF-Force
- Rewrite
- PHP
分類: - 電腦網絡
ID:837
別名:20190704012
理論上,URL 指向的是一個文件,即使是目錄也會按照默認設置尋找 index.html 或 index.php,如果不存在,則由 Web 環境返回 404。
但對於像 Z-BlogPHP 這樣的動態站點,URL 指向都是 index.php,然後由內部邏輯決定是否拋出 404;
讓 URL 指向 index.php 的實現被稱為「URL Rewrite」,中文常常對應為「偽靜態」,嚴格來說,「偽靜態」(Pseudo-static)只是「URL 重寫」的應用之一;
Redirect 則是「重定向(301)」,儘管可以理解為帶有 301 標誌的 Rewrite(?);
為什麼叫「水坑」見:
代碼及講解註釋見下方 Git 鏈接;
每個鏈接對應一次「Git 提交」狀態,也就是「版本控制」,你可以按順序複製保存到你的 Web 環境進行測試,例如URL_Rewrite/index.php
;
大概理解後就換下一個「版本」覆蓋進同一文件查看效果;
純動態模式 - php-rewrite/index.php・70063e1・沉冰浮水 / 水水的舊代碼合集 - Gitee.com
php-rewrite・沉冰浮水 / 水水的舊代碼合集 - 碼雲 - 開源中國:
https://gitee.com/wdssmq/StaleCode/tree/c04e9f96f4654f484510b93d7453ebf0f6c8b53f/php-rewrite
↑ 這裡可以查看效果截圖(純動態模式)
會發現
/?id=1024
和/post/2048.html
兩種訪問返回的「不存在」是不一樣的,後者的 404 是由「web 程序」返回;
「- 現在已經 00:41:31 了,提交一下明天繼續; -」
「- 補充了幾句,拖到 00:46:31 了; -」
所以繼續,前一步代碼中已經定義了$options["is_rewrite"]
作為偽靜態的開關;
現在將該值改為true
然後增加一些代碼;
針對性的偽靜態 - php-rewrite/index.php・6464486・沉冰浮水 / 水水的舊代碼合集 - Gitee.com:
上方網址是此版本內index.php
文件的完整代碼,可以通過右方鏈接查看此提交的「文件變更」信息針對性的偽靜態 - php-rewrite/index.php・6464486・文件變更查看
其中增加的 PHP 代碼如下,本質概念是,在「網站程序」內「打開偽靜態選項」然後根據選項「變更輸出到網頁的內容(主要是鏈接)」;
// 偽靜態開關切換
$options["is_rewrite"] = true;
// 文章url改為靜態形式
if ($options["is_rewrite"]) {
$post["url"] = $options["host"] . "post/3.html";
}
↑ 建議使用前方的「文件變更」鏈接查看,會發現除了index.php
內容有修改外,還多了一份.htaccess
;
而只有正確配置.htaccess
才能完整實現需要的偽靜態效果;
註:.htaccess
為 Apache 的配置文件,IIS 和 Nginx 同樣有各自的規則語法;
總結:
PHP 代碼和文件屬於「網站程序」;
IIS/Nginx/Apache 則可以稱為「web 程序」,「web 程序」配合 PHP 或其他語言的解析引擎,再加上 MySQL 或其他數據庫,構成「web 環境」;
開場提到的「URL Rewrite」則是「web 程序」所提供的功能;
通常情況下,對於 Z-BlogPHP 或類似程序,「開啟偽靜態」需要:
- 程序本身支持;
- 開啟相應選項開關;
- 正確配置「web 程序」對應的規則文件;
其他需要了解的:
- 啟用偽靜態後,
/?id=3
和/post/3.html
均能打開,且訪問到的內容是一樣的,不是 Bug,(本文示例中)也不能讓前者「重定向(301)」到後者,會出錯; - 啟用偽靜態後,
?id=1024
和post/2048.html
均由 PHP 返回不存在信息; - 由 PHP 輸出 404 時,應該同時設置狀態碼:
if ($status == "404") { header("HTTP/1.1 404 Not Found"); header("status: 404 Not Found"); }
- 「重定向(301)」功能 ——「網站程序」和「web 程序」都能實現,對於有規律的,強烈建議由「web 程序」實現;
- 好吧。。好像 301 和 302 都算「重定向」,只不過是永久和臨時的區別;
- 302 到是一般由「網站程序」自己使用;
- 在本文中只配置了「文章」的偽靜態規則,實際程序中還會有「標籤」「分類」「日期」等等,各自寫 Rewrite 規則好像就比較繁瑣了;
- 所以一種選擇就是,對於不存在實現文件的訪問請求,全部交由 PHP 處理;
- 見「php-rewrite/.htaccess・沉冰浮水 / 水水的舊代碼合集 - 碼雲 - 開源中國」←
12 ~14
行註釋掉的部分,也是 Z-BlogPHP 預置的規則形式;
「- 大概就這樣吧,寫完中午都過去了。 -」