偽靜態和重定向(apache)學習筆記

somehow1002發表於2017-10-03

日誌

錯誤日誌檔案:

/logs/error.log(或error_log)

日誌級別(級別從高到低):

debug, info, notice, warn, error, crit, alert, emerg.

低階別的日誌選項會包括高階別的資訊,如info會包含notice、warn的資訊
預設配置:

LogLevel warn

除錯配置(舉例):

LogLevel alert rewrite:trace8

.htaccess語法

Flag使用

重定向(內部跳轉301)

舉例:將.htm訪問跳轉到.html上

RewriteEngine on
RewriteRule ^(.*)\.htm$ $1.shtml

R 重定向(外部跳轉302)

備註:R方式的重定向預設是相對一個基準路徑的,加上/才會訪問當前根目錄下。可以通過設定RewriteBase來設定基準路徑。
舉例:將.htm訪問跳轉到根目錄下的.html上

RewriteEngine on
RewriteRule ^(.*)\.htm$ /$1.html [R]

301和302的區別
301 永久重定向,SEO友好,網站SEO評價會傳到重定向網址
302 臨時重定向

C 滿足條件執行下一跳規則

例子:*.htm會跳轉到*.php,*.html不會跳轉到*.php

RewriteEngine on
RewriteRule ^(.*)\.htm$ $1.html [C]
RewriteRule ^(.*)\.html$ $1.php

L 該規則為最後一條執行規則,下面的規則都不執行

例子:

RewriteEngine on
RewriteRule ^(.*)\.html$ first.php?url=$1 [L]
RewriteRule ^(.*)\.html$ second.php?url=$1

NE 特殊字元不進行轉義

例子:會顯示#(沒有轉義)

RewriteEngine on
RewriteRule ^(.*)\.html$ /index.php#$1 [R,NE]

NC 匹配模式大小寫不敏感

例子:/AAA/… 也會被匹配

RewriteEngine on
RewriteRule ^aaa/(.*)\.html$ /bbb/$1.html [NC]

G 連結失效(GONE)

例子:

RewriteEngine on
RewriteRule ^aaa/(.*)$ - [G]

QSA 擷取URL中的鍵值對

例子:訪問per/index.php?name=xiaoming會跳轉到/per.php?url=index.php&name=xiaoming

RewriteEngine on
RewriteRule ^per/(.*)$ /per.php?url=$1 [R,QSA]

RewriteBase 配置跳轉基準路徑

例子:

  • 內部跳轉:直接替換
RewriteEngine on
RewriteRule ^(.*)\.htm$ $1.html
  • 外部跳轉:替換時會加上絕對路徑,所以一般需要在$1前加上/來實現相對跳轉功能
RewriteEngine on
RewriteRule ^(.*)\.htm$ /$1.html [R]
  • 若要用外部跳轉實現內部跳轉效果,需要配置基準跳轉路徑RewriteBase
RewriteEngine on
RewriteBase /
RewriteRule  ^(.*)\.htm$ $1.html [R]

內部跳轉和外部跳轉(重定向)的區別
內部跳轉url不會改變
外部跳轉url會改變成跳轉到的網址

RewriteCond 條件控制

很容易理解,滿足Rewritecond的,才會執行RewriteRule
舉例:

  • 使用rule變數
    例子:URL中含有test的才能執行RewriteRule
RewriteEngine on
RewriteCond $1 "test"
RewriteRule ^(.*)\.htm$ $1.html
  • 使用系統變數
    例子:當訪問host為127.0.0.1時,自動跳轉到localhost
RewriteEngine on
RewriteCond %{HTTP_HOST} "127.0.0.1"
RewriteRule ^(.*)$ http://localhost/$1 [R]
  • 使用cond變數
    例子:先取出地址最後一位數字,存放在%1中,如果等於1,則執行rule
RewriteEngine on
RewriteCond %{HTTP_HOST} "127.0.0.(.*)"
RewriteCond %1 "2"
RewriteRule ^(.*)$ http://localhost/$1 [R]
  • 特殊標記
判斷為目錄 -d
判斷為檔案 -f

條件判斷 [OR]

加[OR]之後,只要有cond之間一個滿足,即可執行rule
而預設情況是所有cond之間為and,即所有cond成立,才執行rule
例子:下面例子中會執行rule

RewriteEngine on
RewriteCond C:/Windows/ -d [OR]
RewriteCond C:/Windows/ -f
RewriteRule ^(.*)\.htm$ $1.html

RewriteMap使用

apache的rewrite模組進行rewrite的時候,需要將規則直接寫到http.conf的rewrite模組中,並且規則變動一次就需要重啟apache伺服器一次。這個讓開發者比較鬱悶。這裡有一個rewriteMap解決了部分的問題,他的工作就是將一個對映關係以Map的形式儲存在一個檔案中,我們可以通過修改這個檔案的對應關係而不需要重啟apache伺服器就可以應用對映關係。
常用格式
txt格式 一般對映
rnd格式 隨機對映,匹配結果可能有多個
例子1:瀏覽器訪問localhost/tt1會訪問test11。。。
httpd.conf內部

RewriteMap pages txt:E:/page.txt

.htaccess中

RewriteRule ^(.*).html$ ${maps:$1|NotFound}

page.txt中

#首行加註釋或空一行可以得出正常結果,原因待分析
tt1 test11
tt2 test22

例子2:瀏覽器訪問localhost/URL1會隨機訪問localhost/S1(或S2、S3)
在httpd.conf內部

RewriteMap dirs rnd:E:/dir.txt

.htaccess中

RewriteRule ^(.*).html$ /$(dirs:$1|NotFound)/$1.php

dir.txt中

#首行加註釋或空一行可以得出正常結果
URL1 S1|S2|S3
URL2 S4|S5

應用

防盜鏈

例子:圖片只能通過localhost訪問

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !localhost [NC]
RewriteRule \.(gif|png|jpg|jpeg)$ - [F,NC]

防盜鏈針對http_referer而制定,部分瀏覽器(或外掛)做了一些改變,傳送請求不帶http_referer,這種方法則無法防盜鏈

限制IP訪問(重定向)

httpd.conf中

#拒絕指定IP訪問(重定向)
RewriteMap hosts-deny txt:E:/host-deny.txt

.htaccess中

RewriteEngine on
RewriteCond ${hosts-deny:%{REMOTE_ADDR}|NotFound} deny 
RewriteRule ^ - [F]

host-deny中新增限制IP

#測試限制IP
192.168.2.100 deny
127.0.0.1 deny

相關文章