沉冰浮水

沉冰浮水

做最终到的事,成为最终成为的人!
github
bilibili
mastodon
zhihu
douban

「水坑」深入解釋偽靜態相關的知識

標題:「水坑」略深入的講解偽靜態相關的知識
日期: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

https://gitee.com/wdssmq/StaleCode/blob/70063e12f67c31ba5588a2b2a0a0e3fe727ea37b/php-rewrite/index.php


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:

https://gitee.com/wdssmq/StaleCode/blob/6464486539fdb4f53a9b834d2a2d444587f14fe8/php-rewrite/index.php


上方網址是此版本內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=1024post/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 規則好像就比較繁瑣了;

「- 大概就這樣吧,寫完中午都過去了。 -」

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。