tid=192& 本帖最後由 IT_man 於 2014-12-24 18:42 編輯 7 h% c, w3 ^( ^7 ], Z
& P- @4 _; e8 t' _$ A【前言】由於敝網站的需要,主要是為了SEO(search engine optimize) in discuz x3.2 的後台->全局->SEO設置->URL靜態化(設定教學),google了一些資料,如下:4 W; T8 f" B. ~4 k
【介紹】
. l; E7 H: T% g, ?9 Z4 RURL Rewrite(URL重導向)是一種REST (Representational State Transfer,表徵狀態轉移)的相關技術,它可以在 Web Server 中,針對使用者所提供的 URL 進行轉換後,再傳入 Web Server 中的程式處理器。( I, r9 \, b4 [+ J6 k- \1 c4 c- ]2 `
使用者可以使用較直覺的方式來輸入 URL(這也是 REST 的主要目的),是搜尋引擎最佳化(SEO)的作法之一。而應用程式開發者可以利用這個機制來將參數隱藏起來,可避免讓網路上的惡意使用者收集到有利於發動攻擊的資訊。
* `# D/ u; R% w# v) N+ A W6 b% o【整理】2 p" m& D8 l3 b1 d& v
使用ReWrite 設定,很方便地可將原本是『http://www.av4u.info/forum.php?mod=viewthread&tid=192&extra=page%3D1』樣式的動態URL,變成『http://www.av4u.info/thread-192-1-1.html』形式的 '靜態URL。
& X y8 D) q. L& _/ \: _. pReWrite是以正規表示式來表達,關於正規表示式的語法請參考。
+ z, D7 v$ s) t3 n/ w使用 ReWrite 的好處有二:
8 [. ^( l: o3 ]: S; I+ oI.讓 URL 看起來比較短,不帶參數的 '靜態URL' 形式對使用者來說比較習慣;
% M1 ]0 @: C7 Z* C0 k% a3 I" nII.有利於 SEO,搜尋引擎比較好抓。
- p+ |) A6 ~, u5 ]2 F【Rewrite語法】
- V9 r0 g4 n- T( g. t4 L( z先以例子1說明:- RewriteEngine on" M, V9 f' ~4 h8 g
- RewriteCond %{HTTP_USER_AGENT} ^Mozilla/5.0.*5 E2 \9 [" o& }; U3 y6 k2 E
- RewriteRule index.php index.m.php6 g6 `# D/ e& i$ z
- RewriteCond %{HTTP_USER_AGENT} ^Lynx.*; r! p4 S& @& \0 s7 B) _1 d
- RewriteRule index.php index.L.php* c' `( M/ w x$ x8 [9 g
- RewriteRule index.php index.b.php- ]( f$ O3 j6 A$ Z, @5 W) j
複製代碼 語意等同於:
6 A# @. C- J& x2 E+ T% ~- if($_SERVER['HTTP_USER_AGENT'] == 'Mozilla/5.0′) //FireFox瀏覽器+ Q# h+ K U! a1 }2 v
- {( I. b3 G7 I% o) G2 r0 @
- //轉向到index.m.php% f, R5 E" p0 r. @7 S3 k4 }
- }
6 R% P( }8 Q2 @7 w4 Q - else if($_SERVER['HTTP_USER_AGENT'] == 'Lynx') //移動設備的瀏覽器
5 D: g7 ]4 v" s4 p - {
f7 P. v2 ~4 H7 _/ \' ~9 f - //轉向到index.L.php7 N! b- x: F& e/ R; u
- }, P, x3 G3 s* B) p" c. q
- else //其他版本的瀏覽器
9 m, o" u0 R3 A9 y - //轉向到index.b.php
複製代碼 例子2.
- {/ s. ?# L$ N4 `6 o9 n/ z( O- RewriteCond %{REMOTE_HOST} ^host1.* [OR]* d6 e8 g: m8 p0 O0 c$ k0 I+ W! N
- RewriteCond %{REMOTE_HOST} ^host2.* [OR]
- [ A/ R+ U6 Q1 R. C; g+ S - RewriteCond %{REMOTE_HOST} ^host3.*
& c8 j" L; n6 X5 @ - RewriteRule (.*)$ test.php
複製代碼 如果地址是host1或host2或host3的時候,就轉跳到對test.php。
: |. _% p" w" [. h4 [7 j從這裡可以看出,RewriteCond語句之間內定邏輯是AND,如果想要OR,則要明確的寫出來。
0 Y3 O- p$ x! [4 j以下介紹ReWrite語法:, m( m7 @3 _, A( [' F3 Z
RewriteCond TestString CondPattern [Flags]
& ^# }. R4 k( d/ t! v# YTestString 是指一個URL格式的條件,例子中用的是環境變數名稱HTTP_HOST所包含的內容(Name= Value),這是一個map(鍵值對)格式的資料類型。6 i% k+ b2 j Z
CondPattern 是條件參數,以第二個例子為例,就是host1.*。
8 b6 M' J! j2 \4 R8 G4 `4 w5 uFlags 標識是第三個參數,可以用來緊跟下一個條件,這兒用OR表示或者,如果沒有[Flags],則用隱含的AND,表示「並且」。0 o$ W! k* @% E& B5 R
其它的還可以「NC」等等,表示忽略大小寫,RewriteCond就像我們程式中的if語句一樣,表示如果符合某個或某幾個條件則執行RewriteCond下面緊鄰的RewriteRule語句,這就是RewriteCond最原始、基礎的功能。
* L# b1 e0 U5 N) z
) ?3 e9 p3 ?+ L+ c" j6 RFlags 還有更多用法:/ E* S" h5 P. Q
I (ignore case)不管大小寫強行指定字串匹配,這個FLAG影響RewriteRule指令和相應的RewriteCond 指令
! C; _3 l N0 f2 xF (Forbidden) 對客戶端做反應,停止REWRITING程序並且送出403錯誤,注意在這種情況下FORMATSTRING 是無用的並可以設置為任何非空字串。$ g$ z6 u; s3 J6 o& ~& m1 f
L (last rule) 不應用任何重寫規則,在此停止重寫程序,使用這個FLAG以阻止當前被重寫的URI被後面的規則再次重寫 }& B' Y3 X) H
N (Next iteration) 強制REWRITINGENGINE調整規則目標並且從頭重啟規則檢查(所有修改將保存),重啟次數由RepeatLimit指定的值限制,如果這個數值超過N FLAG將被忽略1 O" ], |6 A7 {7 @' g. g4 w7 y! N
NS (Next iteration of the same rule) 以N標記工作不從相同的規則重啟規則程序(例如強制重複規則應用),透過RepeatLimit指令指定一個反複執行某一規則的最大數目,7 c3 g) T- L6 D2 i, `
P (force proxy) 強制目的URI在內部強制為代理需求並且立即透過ISAPI擴展應付代理需求,必須確認代理字串是一個有效的URI包括協議主機等等否則代理將返回錯誤
- V' w3 ~4 |1 P3 B9 wR (explicit redirect)強制服務器對客戶端發出重定向指示即時應答,提供目的URI的新地址,重定向規則經常是最後規則
4 v, f/ a2 b! l/ y4 `0 z! y ~RP (permanent redirect) 幾乎和[R]標記相同但是發布301HTTP狀態而不是302HTTP狀態代碼
3 q) B2 t S, H5 gU (Unmangle Log) 當URI是來源需求而不是重寫需求時記載URI
* |; B. S+ F" R) qO (nOrmalize) 在實行之前標準化字串。標準化包括URL-ENCODING,不合法的字串的再移動等,這個標記對於URLS和URLS-ENDODED頭是有用的
& T1 A, X) Z. i6 ^CL (Case Lower) 小寫- `- n& K3 k( j/ \4 r+ Q
CU (Case Upper) 大寫& E& ]; i) j% ^3 o; n) A. y Q, X" _3 X
重點來了,要如何設定才能實現上述的功能,以下是我的例子(.htaccess 及 apache的httpd.conf皆適用正規表示式):# T; d! _: I3 X6 x x$ G
- .htaccess 此檔放於網站的根目錄
- # -FrontPage-
v$ z+ \3 B0 G' y7 s7 q - IndexIgnore .htaccess */.??* *~ *# */HEADER* */README* */_vti*- X' r# z$ Y* K, A. p3 f. S( a9 t! y
- # disable directory browsing
& r* L; Q& q9 z/ g - Options All -Indexes
5 Y1 b) m- ~& |9 D7 D$ E - RewriteEngine On # 將 RewriteEngine 模式打開* C: @' \7 M$ ^- _
- RewriteBase / #設定為網站的根目錄
3 J5 p( v5 Y: a2 `" n) ` - #
) E0 B/ Y0 i2 f/ ~) d7 @6 _/ ^# { - RewriteCond %{HTTP_HOST} ^av4u.info [NC]
+ y3 x/ \0 \- t9 y# r z' l9 F+ D - RewriteRule ^(.*)$ HTTP://www.av4u.info/$1 [L]7 p/ o4 P$ H/ \( D- Q
- RewriteRule ^forum-(\w+)-([0-9]+)\.html$ forum.php?mod=forumdisplay&fid=$1&page=$2
; e" L! k: @1 k9 U0 j - RewriteRule ^thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ forum.php?mod=viewthread&tid=$1&extra=page\%3D$3&page=$20 L* p: f+ v2 Z
複製代碼
5 H4 e0 x% e+ q, t! | l- K2 c
- Apache之httpd.conf 打開 /etc/httpd/conf/httpd.conf並加入你的網站目錄段如下:
- <Directory "/www/coav4u/test">/ b2 Z" Z( X' w( r2 C9 G
- RewriteEngine On # 將 RewriteEngine 模式打開
" B, H! J; I0 [, E6 T - RewriteBase / #設定為網站的根目錄9 f `9 _% N% x1 z( ^. A$ ^5 v
- RewriteCond %{HTTP_HOST} ^av4u.info [NC]
4 T- E% q5 j" e& E1 u/ u' N6 y! v - RewriteRule ^(.*)$ HTTP://www.av4u.info/$1 [L]
, c, @+ |) _: o2 C4 N" n' O - RewriteRule ^forum-(\w+)-([0-9]+)\.html$ forum.php?mod=forumdisplay&fid=$1&page=$2
# Z# a( `: Y% `& ^: `$ b7 K" _: u - RewriteRule ^thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ forum.php?mod=viewthread&tid=$1&extra=page\%3D$3&page=$21 s6 _! m3 ~, @2 q1 U5 |! U1 J
- Options Includes FollowSymLinks
$ s" P9 Q9 w) Z1 ?8 x6 m - AllowOverride All! b# f1 O& T5 n5 S: b* m8 s4 o
- Allow from all
( L( w* G! p! z4 T* P4 a - Order allow,deny$ v5 K T- Z3 Y2 F
- addDefaultCharset UTF-8
( T3 L5 A+ t* Z - </Directory># Z# H% C$ E' k" x4 t$ E
複製代碼 存檔後記得重啟httpd : service httpd restart 才會生效
& C& c* \# y' n
|