請選擇 進入手機版 | 繼續訪問電腦版
搜索
熱搜: 活動 交友 discuz
查看: 4032|回復: 0

[Apache] [Apache] .htaccess - URL Rewrite(網址重寫)教學

[複製鏈接]
發表於 2014-3-22 12:09:07 | 顯示全部樓層 |閱讀模式
URL Rewrite是一種REST (Representational State Transfer,表徵狀態轉移)的相關技術,它可以在 Web Server 中,針對使用者所提供的 URL 進行轉換後,再傳入 Web Server 中的程式處理器。

使用者可以使用較直覺的方式來輸入 URL(這也是 REST 的主要目的),是搜尋引擎最佳化(SEO)的作法之一。而應用程式開發者可以利用這個機制來將參數隱藏起來,可避免讓網路上的惡意使用者收集到有利於發動攻擊的資訊。


1、.htaccess 語法簡介
  1. RewriteEngine ON
  2. RewriteCond %{HTTP_HOST} ^abc.com$ [OR]
  3. RewriteCond %{REQUEST_URI} ^/$
  4. RewriteRule ^(.*)$ http://www.888.com/ [R=301,L]

  5. RewriteEngine on
  6. RewriteCond %{ HTTP_HOST } ^888.com
  7. RewriteRule ^(.*)$ http://888.com/hot$1 [R=301,L]
  8. RewriteCond %{ HTTP_HOST } ^www.888.com
  9. RewriteRule ^(.*)$ http://www.888.com/hot$1 [R=301,L]
複製代碼



1.1、 RewriteCond的語法如下:
  1. RewriteCond TestString CondPattern [Flags]
複製代碼
TestString 是指一個文本格式的條件,例子中用的是環境變量名HTTP_HOST所包含的內容(Name= Value),這是一個map(鍵值對)格式的數據類型。

CondPattern 是條件參數,這兒以第一個例子為例,就是abc.com。

Flags 標識是是第三個參數,可以用來緊跟下一個條件,這兒用OR表示或者,如果沒有[Flags],則用隱含的AND,表示並且。

其它的還可以NC等等,表示忽略大小寫RewriteCond就像我們程序中的if語句一樣,表示如果符合某個或某幾個條件則執行RewriteCond下面緊鄰的RewriteRule語句,這就是RewriteCond最原始、基礎的功能,為了方便理解,下面來看看幾個例子。
  1. RewriteEngine on
  2. RewriteCond %{HTTP_USER_AGENT} ^Mozilla/5.0.*
  3. RewriteRule index.php index.m.php
  4. RewriteCond %{HTTP_USER_AGENT} ^Lynx.*
  5. RewriteRule index.php index.L.php
  6. RewriteRule index.php index.b.php
複製代碼
上面語句的作用是當你是用FF瀏覽器訪問index.php這個文件的時候,會自動讓你訪問到index.m.php這個文件,當你是用一些移動終端訪問的時候,會讓你對index.php這個文件的訪問實際訪問的是index.L.php去,如果你是用其它的瀏覽器訪問的時候,會讓你跳到index.b.php。在說形像一點,上面的語句就等同於程序裡面的下面語句(依PHP語句為例):
  1. if($_SERVER['HTTP_USER_AGENT'] == 'Mozilla/5.0′)
  2. {
  3. //跳轉到對index.m.php的訪問
  4. }
  5. else if($_SERVER['HTTP_USER_AGENT'] == 'Lynx')
  6. {
  7. //跳轉到對index.L.php的訪問
  8. }
  9. else
  10. //跳轉到對index.b.php的訪問
複製代碼
再看例2:
  1. RewriteCond %{HTTP_REFERER} (www.test.com)
  2. RewriteRule (.*)$ test.php
複製代碼
上面語句的作用是如果你訪問的上一個頁面的主機地址是www.test.com,則無論你當前訪問的是哪個頁面,都會跳轉到對test.php的訪問。

再看例3:
  1. RewriteCond %{REMOTE_HOST} ^host1.* [OR]
  2. RewriteCond %{REMOTE_HOST} ^host2.* [OR]
  3. RewriteCond %{REMOTE_HOST} ^host3.*
  4. RewriteRule (.*)$ test.php
複製代碼
上面語句的作用是如果你的地址是host1或host2或host3的時候,則就跳到對test.php。

從這裡可以看出,RewriteCond語句之間默認的是AND,如果想要OR,則要明確的寫出來。

下面是自己收藏的一些有用的重寫規則:
RewriteCond %{REQUEST_FILENAME} !-f //如果文件存在,就直接訪問文件,不進行下面的RewriteRule.(不是文件或文件不存在就執行重寫)
RewriteCond %{REQUEST_FILENAME} !-d //#如果目錄存在就直接訪問目錄不進行RewriteRule
RewriteCond %{REQUEST_URI} !^.*(.css|.js|.gif|.png|.jpg|.jpeg)$ //#如果是這些後綴的文件,就直接訪問文件,不進行Rewrite




1.2、RewriteRule的語法如下:
  1. RewriteRule Pattern Substitution [Flags]
複製代碼
其中的Pattern就是參數,一般為一些文件的擴展名,Substitution是用來替換前面用的,這兒的Flags,常用的R表示redirect(強制重定向),F表示forbidden(禁止訪問),L表示last(最後),通常當你希望停止重寫操作而立即重定向時,可用它。

參數表:

I (ignore case)

不管大小寫強行指定字符匹配,這個FLAG影響RewriteRule指令和相應的RewriteCond 指令

F (Forbidden)
對客戶端做反應,停止REWRITING進程並且發送403錯誤,注意在這種情況下FORMATSTRING 是無用的並可以設置為任何非空字符串。

L (last rule)
不應用任何重寫規則在此停止重寫進程,使用這個FLAG以阻止當前被重寫的URI被後面的規則再次重寫

N (Next iteration)
強制REWRITINGENGINE調整規則目標並且從頭重啟規則檢查(所有修改將保存),重啟次數由RepeatLimit指定的值限制,如果這個數值超過N FLAG將被忽略

NS (Next iteration of the same rule)
以N標記工作不從相同的規則重啟規則規則進程(例如強制重複規則應用),通過RepeatLimit指令指定一個反复實行某一規則的最大數目,

P (force proxy)
強制目的URI在內部強制為代理需求並且立即通過ISAPI擴展應付代理需求,必須確認代理字符串是一個有效的URI包括協議主機等等否則代理將返回錯誤

R (explicit redirect)
強制服務器對客戶端發出重定向指示即時應答,提供目的URI的新地址,重定向規則經常是最後規則

RP (permanent redirect)
幾乎和[R]標記相同但是發布301HTTP狀態而不是302HTTP狀態代碼

U (Unmangle Log)
當URI是源需求而不是重寫需求時記載URI

O (nOrmalize)
在實行之前標準化字符串。標準化包括URL-ENCODING,不合法的字符的再移動等,這個標記對於URLS和URLS-ENDODED頭是有用的

CL (Case Lower)
小寫

CU (Case Upper)
大寫


1.3、.htaccess 用到的正則表達式:

元字符^(和數字6在同一個鍵位上的符號)和$都匹配一個位置,這和\b有點類似。
  1. ^ 匹配你要用來查找的字符串的開頭
  2. $ 匹配結尾。
  3. 比如一個網站如果要求你填寫的QQ號必須為5位到12位數字時,可以使用:^\d{5,12}$。
  4. \b代表著單詞的開頭或結尾,也就是單詞的分界處,它只匹配一個位置。
  5. \d是個新的元字符,匹配一位數字(0,或1,或2,或……)。
  6. 例:0\d{2}-\d{8} 匹配這樣的字符串:以0開頭,然後是兩個數字,然後是一個連字號“-”,最後是8個數字(也就是中國的電話號碼。當然,這個例子只能匹配區號為3位的情形)。
  7. \s匹配任意的空白符,包括空格,製表符(Tab),換行符,中文全角空格等。
  8. \w匹配字母或數字或下劃線或漢字
  9. \來取消字符的特殊意義。可使用\.和\*。要查找\本身,也得用\\.
  10. [ ] 匹配沒有預定義元字符的字符集合,在方括號裡列出它們就行了
  11. 例: [aeiou]就匹配任何一個英文元音字母,[.?!]匹配標點符號(.或?或!)
  12. [0-9]代表的含意與\d就是完全一致的:一位數字;同理[a-z0-9A-Z_]也完全等同於\w
  13. .匹配除 “\n” 之外的任何單個字符。要匹配包括'\n' 在內的任何字符,請使用象'[.\n]' 的模式。
  14. 例子:\(?0\d{2}[) -]?\d{8}。
複製代碼
像(010)88886666,或022-22334455,02912345678等。
分析:首先是一個轉義字符\(,它能出現0次或1次(?),
然後是一個0,後面跟著2個數字(\d{2}),
然後是)或-或空格中的一個,它出現1次或不出現(?),最後是8個數字(\d{8})。
  1. * 重複零次或更多次
  2. + 重複一次或更多次
  3. ? 重複零次或一次
  4. {n} 重複n次
  5. {n,} 重複n次或更多次
  6. {n,m} 重複n到m次
複製代碼



1.4 .htaccess放置參考wordpress的偽靜態寫法:

# BEGIN WordPress
  1. RewriteEngine On
  2. RewriteBase /
  3. RewriteRule ^index\.php$ – [L]
  4. RewriteCond %{REQUEST_FILENAME} !-f
  5. RewriteCond %{REQUEST_FILENAME} !-d
  6. RewriteRule . /index.php [L]
複製代碼
# END WordPress

補充用法:
  1. RewriteEngine On
  2. RewriteCond %{REQUEST_FILENAME} !-d
  3. RewriteCond %{REQUEST_FILENAME} !-f
  4. RewriteRule ^(.*)$ index.php/?page=$1 [QSA,L]
複製代碼
/bi/hi/sdfoij 就會變成 index.php?page=bi/hi/sdfoij ,$_GET['page'] = bi/hi/sdfoij




常見的.htaccess應用舉例

防止盜鏈,如果來得要訪問jpe jpg bmp png結尾的url 用戶不是來自我們的網站,那麼讓他看一張我們網站的展示圖片。
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .*.(jpe?g|gif|bmp|png)$ / images/nohotlink.jpg [L]

網站升級的時候,只有特定IP才能訪問,其他的用戶將看到一個升級頁面
RewriteEngine on
RewriteCond %{REQUEST_URI} !/upgrade.html$
RewriteCond %{REMOTE_HOST} !^24\.121\.202\.30
RewriteRule $ http://www.linuxidc.com/upgrade.html [R=302,L]

把老的域名轉向新域名
# redirect from old domain to new domain
RewriteEngine On
RewriteRule ^(.*)$http://www.yourdomain.com/$1[R=301,L]

更多例子:

1. 使用.htaccess 創建自定義的出錯頁面。對於Linux Apache來說這是一項極其簡單的事情。使用下面的.htaccess語法你可以輕鬆的完成這一功能。 (把.htaccess放在你的網站根目錄下)
ErrorDocument 401 /error/401.php
ErrorDocument 403 /error/403.php
ErrorDocument 404 /error/404.php
ErrorDocument 500 /error/500.php


2. 設置網站的時區
SetEnv TZ America/Houston

3. 阻止IP列表
有些時候,你需要以IP地址的方式阻止一些訪問。無論是對於一個IP地址還是一個網段,這都是一件非常簡單的事情,如下所示:

allow from all
deny from 145.186.14.122
deny from 124.15
Apache對於被拒絕的IP會返回403錯誤。

4. 把一些老的鏈接轉到新的鏈接上——搜索引擎優化SEO
Redirect 301 /d/file.htmlhttp://www.htaccesselite.com/r/file.html

5. 為服務器管理員設置電子郵件。
ServerSignature EMail
SetEnv SERVER_ADMINdefault@domain.com

6. 使用.htaccess 訪止盜鏈。如果你網站上的一個圖片被別的N多的網站引用了,那麼,這很有可能會導致你服務器的性能下降,使用下面的代碼可以保護某些熱門的鏈接不被過多的引用。

Options +FollowSymlinks
# Protect Hotlinking
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www.)?domainname.com/[nc]
RewriteRule .*.(gif|jpg|png)$[nc]
7. 阻止 User Agent 的所有請求

## .htaccess Code :: BEGIN
## Block Bad Bots by user-Agent
SetEnvIfNoCase user-Agent ^FrontPage [NC,OR]
SetEnvIfNoCase user-Agent ^Java.* [NC,OR]
SetEnvIfNoCase user-Agent ^Microsoft.URL [NC,OR]
SetEnvIfNoCase user-Agent ^MSFrontPage [NC,OR]
SetEnvIfNoCase user-Agent ^Offline.Explorer [NC,OR]
SetEnvIfNoCase user-Agent ^[Ww]eb[Bb]andit [NC,OR]
SetEnvIfNoCase user-Agent ^Zeus [NC]

Order Allow,Deny
Allow from all
Deny from env=bad_bot

## .htaccess Code :: END
8. 把某些特殊的IP地址的請求重定向到別的站點
ErrorDocument 403http://www.youdomain.com
Order deny,allow
Deny from all
Allow from 124.34.48.165
Allow from 102.54.68.123

9. 直接找開文件而不是下載– 通常,我們打開網上文件的時候總是會出現一個對話框問我們是下載還是直接打開,使用下面的設置就不會出現這個問題了,直接打開。
AddType application/octet-stream .pdf
AddType application/octet-stream .zip
AddType application/octet-stream .mov

10. 修改文件類型– 下面的示例可以讓任何的文件都成為PHP那麼被服務器解釋。比如:myphp, cgi,phtml等。
ForceType application/x-httpd-php
SetHandler application/x-httpd-php

11. 阻止存取.htaccess 文件
# secure htaccess file

order allow,deny
deny from all

12. 保護服務器上的文件被存取
# prevent access of a certain fileorder allow,deny
deny from all

13. 阻止目錄瀏覽
# disable directory browsing
Options All -Indexes

14. 設置默認主頁
# serve alternate default index page
DirectoryIndex about.html
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

本論壇為非營利之網路平台,所有文章內容均為網友自行發表,不代表論壇立場!若涉及侵權、違法等情事,請告知版主處理。


Page Rank Check

廣告刊登  |   交換連結  |   贊助我們  |   服務條款  |   免責聲明  |   客服中心  |   中央分站

手機版|中央論壇

GMT+8, 2020-9-28 16:47 , Processed in 0.097885 second(s), 17 queries .

Powered by Discuz!

© 2005-2015 Copyrights. Set by YIDAS

快速回復 返回頂部 返回列表