52AV手機A片王|52AV.ONE
標題:
[SEO] ReWrite 設定讓 URL 動態樣式變靜態樣式(長變短)
[打印本頁]
作者:
IT_man
時間:
2014-12-23 17:59
標題:
[SEO] ReWrite 設定讓 URL 動態樣式變靜態樣式(長變短)
本帖最後由 IT_man 於 2014-12-24 18:42 編輯
3 F1 I4 G' W7 K/ D) v* S |
3 [6 ? G1 G1 p( p. p
【前言】
由於敝網站的需要,主要是為了SEO(search engine optimize) in discuz x3.2 的後台->全局->SEO設置->URL靜態化(
設定教學
),google了一些資料,如下:
& {- E/ e( v1 l: ?% {
【介紹】
* V8 b( X- g2 y/ z4 h1 y* U7 m
URL Rewrite(URL重導向)是一種REST (
Representational State Transfer
,表徵狀態轉移)的相關技術,它可以在 Web Server 中,針對使用者所提供的 URL 進行轉換後,再傳入 Web Server 中的程式處理器。
1 [- C5 c# t" s/ f; L o' I
使用者可以使用較直覺的方式來輸入 URL(這也是 REST 的主要目的),是搜尋引擎最佳化(SEO)的作法之一。而應用程式開發者可以利用這個機制來將參數隱藏起來,可避免讓網路上的惡意使用者收集到有利於發動攻擊的資訊。
$ E, @5 D9 ~4 I- O9 L& |
【整理】
& W# h# M* ^5 K: N7 r4 G. Z
使用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。
& y" {+ ^" U" ^ d" s1 H% c
ReWrite是以正規表示式來表達,關於正規表示式的語法請參考。
; O: I- ?2 \' ^
使用 ReWrite 的好處有二:
5 H2 h/ ^" s' Y1 ?
I.
讓 URL 看起來比較短,不帶參數的 '靜態URL' 形式對使用者來說比較習慣;
8 n7 z1 ?% p4 k# v+ B9 u
II.
有利於 SEO,搜尋引擎比較好抓。
% I& h/ Z( k7 X; [6 u5 e, v
【Rewrite語法】
. {( T, Y! r+ W/ I& x+ x7 D b
先以例子1說明:
RewriteEngine on
) {/ R; U: { B' E. {
RewriteCond %{HTTP_USER_AGENT} ^Mozilla/5.0.*
) P+ k% C: p* t7 x c4 f
RewriteRule index.php index.m.php
4 D4 _3 ~7 S3 h$ o
RewriteCond %{HTTP_USER_AGENT} ^Lynx.*
, ^0 T) Z: T: Q
RewriteRule index.php index.L.php
5 {6 r; A) g- s! {: O# {, j, c
RewriteRule index.php index.b.php
" i4 }6 w0 N0 j0 a) r
複製代碼
語意等同於:
6 U& D# g6 Z. e' Q- T7 p
if($_SERVER['HTTP_USER_AGENT'] == 'Mozilla/5.0′) //FireFox瀏覽器
& U- q: a4 L# J$ J
{
8 [3 \6 ^* H7 r8 U. U& Y
//轉向到index.m.php
7 q- E+ v; ~: `
}
, }' c# u1 q8 ]- R
else if($_SERVER['HTTP_USER_AGENT'] == 'Lynx') //移動設備的瀏覽器
: z6 f2 e! J! s6 f0 ^: O
{
# z! B* x! _+ h2 S: O) r% o: D
//轉向到index.L.php
q+ g5 r) C/ Y, i, R7 x( t
}
3 L- a9 u# y5 y8 i1 A9 ?$ T
else //其他版本的瀏覽器
: e6 O3 |9 ?8 s9 B* a
//轉向到index.b.php
複製代碼
例子2.
$ D4 V( n" A' p! ~8 k( ~2 _
RewriteCond %{REMOTE_HOST} ^host1.* [OR]
& b: \/ w& x4 K3 O; I+ ^ h
RewriteCond %{REMOTE_HOST} ^host2.* [OR]
- f, ?! K+ D% P9 D* n: E4 w6 A
RewriteCond %{REMOTE_HOST} ^host3.*
4 s5 X1 E% r9 B( c3 r1 D
RewriteRule (.*)$ test.php
複製代碼
如果地址是host1或host2或host3的時候,就轉跳到對test.php。
; x/ P* u, d& g( b' V
從這裡可以看出,RewriteCond語句之間內定邏輯是AND,如果想要OR,則要明確的寫出來。
' s& B5 E! b* `& A
以下介紹ReWrite語法:
3 z: X; J1 n( j$ d+ O$ ^7 s
RewriteCond TestString CondPattern [Flags]
5 t# E2 R$ h: k( s! Y6 z
TestString
是指一個URL格式的條件,例子中用的是環境變數名稱HTTP_HOST所包含的內容(Name= Value),這是一個map(鍵值對)格式的資料類型。
# |, E0 y+ B; ?
CondPattern
是條件參數,以第二個例子為例,就是
host1.*
。
2 ?& ?% [4 u% s8 X- J& x' y
Flags
標識是第三個參數,可以用來緊跟下一個條件,這兒用OR表示或者,如果沒有[Flags],則用隱含的AND,表示
「
並且
」。
e# n5 r! r! Y6 ?6 q) I6 q8 }
其它的還可以
「
NC
」等等,表示忽略大小寫
,
RewriteCond就像我們程式中的if語句一樣,表示如果符合某個或某幾個條件則執行RewriteCond下面緊鄰的RewriteRule語句,這就是RewriteCond最原始、基礎的功能
。
) I9 v G( l8 f3 f3 `/ i4 E0 i
5 B( `7 y4 e4 M S- O$ r. X
Flags 還有更多用法:
3 G3 x' A: k( f/ X
I (ignore case)不管大小寫強行指定字串匹配,這個FLAG影響RewriteRule指令和相應的RewriteCond 指令
y# U# k! w6 ]% n
F (Forbidden) 對客戶端做反應,停止REWRITING程序並且送出403錯誤,注意在這種情況下FORMATSTRING 是無用的並可以設置為任何非空字串。
& f6 u+ T8 f3 W5 X# G
L (last rule) 不應用任何重寫規則
,
在此停止重寫程序,使用這個FLAG以阻止當前被重寫的URI被後面的規則再次重寫
3 J5 P( i* O) D3 i3 k" Y% b# y+ Y$ Y
N (Next iteration) 強制REWRITINGENGINE調整規則目標並且從頭重啟規則檢查(所有修改將保存),重啟次數由RepeatLimit指定的值限制,如果這個數值超過N FLAG將被忽略
0 h+ v% v8 e' \$ Y. ?% s
NS (Next iteration of the same rule) 以N標記工作不從相同的規則重啟規則程序(例如強制重複規則應用),透過RepeatLimit指令指定一個反複執行某一規則的最大數目,
: V5 o7 f6 p, ~$ U, s
P (force proxy) 強制目的URI在內部強制為代理需求並且立即透過ISAPI擴展應付代理需求,必須確認代理字串是一個有效的URI包括協議主機等等否則代理將返回錯誤
$ V) |+ P/ T7 y4 y
R (explicit redirect)強制服務器對客戶端發出重定向指示即時應答,提供目的URI的新地址,重定向規則經常是最後規則
' q( p6 D* k) s7 L) e
RP (permanent redirect) 幾乎和[R]標記相同但是發布301HTTP狀態而不是302HTTP狀態代碼
3 Y6 ], u L5 ~# d; H6 L' i
U (Unmangle Log) 當URI是來源需求而不是重寫需求時記載URI
, V$ ?3 u) x0 G! v7 \
O (nOrmalize) 在實行之前標準化字串。標準化包括URL-ENCODING,不合法的字串的再移動等,這個標記對於URLS和URLS-ENDODED頭是有用的
# R6 b+ Q3 k& N" Z" G
CL (Case Lower) 小寫
9 S) U5 z; u) M" i; [% `% q! G
CU (Case Upper) 大寫
. W; C; n/ R2 Z, A, j" Y" ]
重點來了,要如何設定才能實現上述的功能,以下是我的例子(.htaccess 及 apache的httpd.conf皆適用正規表示式):
* y3 N! j; {3 w3 n& Y
.htaccess
此檔放於網站的根目錄
# -FrontPage-
) s' m' q3 b4 W/ `/ N5 }
IndexIgnore .htaccess */.??* *~ *# */HEADER* */README* */_vti*
& a# A/ F& }1 @; f/ g; c
# disable directory browsing
$ y) W( j( ?7 M. ?- H8 Y7 t& f
Options All -Indexes
4 K. B3 r/ P- [( X9 V
RewriteEngine On # 將 RewriteEngine 模式打開
3 b% ^$ b' h/ L5 {' e
RewriteBase / #設定為網站的根目錄
1 ]8 K1 Z6 a! h( `/ j* r% X/ `; ~$ N
#
) ~8 \; N! V& s$ I" X3 W1 r- d# J
RewriteCond %{HTTP_HOST} ^av4u.info [NC]
; c* T5 u' a, V% H- i9 z
RewriteRule ^(.*)$ HTTP://www.av4u.info/$1 [L]
6 c E5 `" |% m2 Y/ N- ?
RewriteRule ^forum-(\w+)-([0-9]+)\.html$ forum.php?mod=forumdisplay&fid=$1&page=$2
% r* u3 `5 p u% O! b$ B
RewriteRule ^thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ forum.php?mod=viewthread&tid=$1&extra=page\%3D$3&page=$2
: g. v8 Y: J$ H4 {
複製代碼
3 s y) d- b6 k( v+ B* ^1 _
Apache之httpd.conf 打開 /etc/httpd/conf/httpd.conf並加入你的網站目錄段如下:
<Directory "/www/coav4u/test">
" R- d: ?7 j% n: ?
RewriteEngine On # 將 RewriteEngine 模式打開
# Q+ E& l1 @. ]9 n1 R
RewriteBase / #設定為網站的根目錄
$ G# w: {* A( x$ r J. j# Q
RewriteCond %{HTTP_HOST} ^av4u.info [NC]
# y q, F9 s2 \ x! h& K& P
RewriteRule ^(.*)$ HTTP://www.av4u.info/$1 [L]
5 e; q- u8 Q. k* x6 Y
RewriteRule ^forum-(\w+)-([0-9]+)\.html$ forum.php?mod=forumdisplay&fid=$1&page=$2
/ v W# k+ R2 z5 V$ l+ R
RewriteRule ^thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ forum.php?mod=viewthread&tid=$1&extra=page\%3D$3&page=$2
4 O$ ]( A& O2 V/ I A( r
Options Includes FollowSymLinks
% t" k3 M" \" L2 _4 b1 s4 k
AllowOverride All
& `3 q0 C' O$ Z& h0 {. U
Allow from all
- L: S$ \3 k6 o& x, |% q
Order allow,deny
5 N! T1 I7 Y1 h% T& V
addDefaultCharset UTF-8
3 P( n5 K, y1 |+ h
</Directory>
# M; I! L4 O& Q2 {
複製代碼
存檔後記得重啟httpd : service httpd restart 才會生效
1 D2 Z+ Z5 J* w {6 T: q
歡迎光臨 52AV手機A片王|52AV.ONE (https://www.52av.one/)
Powered by Discuz! X3.2