首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Apache .htaccess 重寫規則完整教程:從語法基礎到偽靜態、防盜鏈實戰

     編輯:PHP 相關知識

核心指令速查

指令說明
RewriteEngine On|Off啟用/關閉重寫引擎
RewriteBase /path/指定重寫基準路徑(相對 DocumentRoot)
RewriteCond TestString CondPattern [flags]定義重寫條件(可多條,AND 關係)
RewriteRule Pattern Substitution [flags]定義重寫規則(核心)

常用服務器變量

  • %{HTTP_HOST}:訪問域名(不含協議/路徑)
  • %{REQUEST_URI}:請求路徑(含 /,不含查詢字符串)
  • %{REQUEST_FILENAME}:映射到文件系統的完整路徑
  • %{QUERY_STRING}:查詢字符串
  • %{HTTP_REFERER}:來源頁面 URL
  • %{HTTPS}:是否 HTTPS (on/off)

實戰 1:綁定域名到子目錄(多站點共享 IP)

RewriteEngine On
RewriteBase /

# 條件:訪問 www.example.com 或 example.com
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC]

# 條件:請求路徑不以 /blog/ 開頭(避免死循環)
RewriteCond %{REQUEST_URI} !^/blog/

# 條件:請求非實際文件/目錄
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# 重寫:將所有請求映射到 /blog/ 子目錄
RewriteRule ^(.*)$ /blog/$1 [L]

# 根路徑訪問默認首頁
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC]
RewriteRule ^/?$ /blog/index.php [L]

關鍵點:

  • RewriteBase / 確保 ^(.*)$ 匹配的是相對路徑(不含域名)
  • [NC] 忽略大小寫
  • [L] 最後一條規則,停止後續匹配

實戰 2:防盜鏈(圖片/文件)

RewriteEngine On
RewriteBase /

# 允許空 Referer(直接輸入圖片 URL)
RewriteCond %{HTTP_REFERER} !^$ [NC]

# 允許本域名及子域名
RewriteCond %{HTTP_REFERER} !example\.com [NC]

# 匹配圖片後綴,重寫到防盜鏈圖片
RewriteRule \.(jpg|jpeg|png|gif|bmp|webp)$ /static/images/hotlink.png [R,NC,L]

[R] 觸發 302 重定向,瀏覽器地址欄會變。若想返回 403 直接用 [F]。

實戰 3:強制 HTTPS

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

實戰 4:統一 www / 非 www

# 強制 www
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

# 或強制非 www
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]

常用 Flags 速查

Flag全稱作用
LLast停止重寫,不再處理後續規則
R[=code]Redirect外部重定向(默認 302),可指定 301/302
NCNoCase忽略大小寫匹配
QSAQueryStringAppend保留並追加原查詢字符串
PTPassThrough傳遞給後續處理器(如 Alias、ScriptAlias)
FForbidden返回 403
GGone返回 410
E=VAR:VALEnv設置環境變量
S=NSkip跳過後續 N 條規則

調試技巧

  1. 開啟重寫日誌(Apache 2.4+):LogLevel alert rewrite:trace3(僅調試環境,生產極其耗性能)
  2. 瀏覽器開發者工具 Network 面板觀察重定向鏈
  3. 使用 RewriteLog (Apache 2.2) 或 RewriteLogLevel

避坑指南

  • **死循環**:務必用 RewriteCond %{REQUEST_URI} !^/target/ 排除目標目錄
  • **多條 RewriteCond 默認 AND**,需 OR 時加 [OR] flag
  • **Pattern 匹配的是相對路徑**(受 RewriteBase 影響),非完整 URL
  • **字符轉義**:正則中 . 需寫 \.,% 在 TestString 中需雙寫 %%
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved