13 個mod rewrite 應用舉例

2022-03-12 05:17:33 字數 4496 閱讀 8197

1.給子網域名稱加www標記 

這個規則抓取二級網域名稱的%1變數,如果不是以www開始,那麼就加www,以前的網域名稱以及會跟在其後。

2.去掉網域名稱中的www標記 

rewritecond % !^example\.com$ [nc] 

rewriterule .?  [r=301,l]

3.去掉www標記,但是儲存子網域名稱 

這裡,當匹配到1%變數以後,子網域名稱才會在%2(內部原子)中抓取到,而我們需要的正是這個%1變數。 

4.防止盜鏈 

一些站長不擇手段的將你的盜鏈在他們**上,耗費你的頻寬。你可以加一下

**阻止這種行為。 

如果值不為空,或者不是來自你自己的網域名稱,這個規則用[f]flag阻止以gif|jpg|png 結尾的url 

如果對這種盜鏈你是堅決鄙視的,你還可以改變,讓訪問盜鏈**的使用者知道該**正在盜用你的。 

rewriterule \.(gif|jpg|png)$ 你的位址 [r=301,l] 

除了阻止盜鏈

鏈結,以上規則將其盜鏈的全部替換成了你

設定的。 

你還可以阻止特定網域名稱盜鏈你的: 

這個規則將阻止網域名稱黑名單上所有的鏈結請求。 

當然以上這些規則都是以獲取網域名稱為基礎的,如果你想改用成ip位址,用就可以了。

5.如果檔案不存在重定向到404頁面 

如果你的主機沒有提供404頁面重定向服務,那麼我們自己建立。 

rewritecond % !-f 

rewritecond % !-d 

rewriterule .? /404.php [l] 

這裡-f匹配的是存在的檔名,-d匹配的存在的路徑名。這段**在進行404重定向之前,會判斷你的檔名以及路徑名是否存在。你還可以在404頁面上加乙個?url=$1引數: 

rewriterule ^/?(.*)$ /404.php?url=$1 [l]

這樣,你的404頁面就可以做一些其他的事情,例如預設信心,發乙個郵件提醒,加乙個

搜尋,等等。

6.重新命名目錄

如果你想在**上重新命名目錄,試試這個: 

rewriterule ^/?old_directory/([a-z/.]+)$ new_directory/$1 [r=301,l]

在規則裡我新增了乙個「.」(注意不是代表得所有字元,前面有轉義符)來匹配檔案的字尾名。 

7.將.html字尾名轉換成.php

前提是.html檔案能繼續訪問的情況下,更新你的**鏈結。 

rewriterule ^/?([a-z/]+)\.html$ $1.php [l]

這不是乙個網頁重定向,所以訪問者是不可見的。讓他作為乙個永久重定向(可見的),將flag修改[r=301,l]。 

8.建立無檔案字尾名鏈結

如果你想使你的

php**的鏈結更加簡潔易記-或者隱藏檔案的字尾名,試試這個: 

rewriterule ^/?([a-z]+)$ $1.php [l]

如果**混有php以及html檔案,你可以用rewritecond先判斷該字尾的檔案是否存在,然後進行替換: 

rewritecond %.php -f 

rewriterule ^/?([a-za-z0-9]+)$ $1.php [l] 

rewritecond %.html -f 

rewriterule ^/?([a-za-z0-9]+)$ $1.html [l]

如果檔案是以.php為字尾,這條規則將被執行。

9.檢查查詢變數裡的特定引數

如果在url裡面有乙個特殊的引數,你可用rewritecond鑑別其是否存在: 

rewritecond % !uniquekey= 

rewriterule ^/?script_that_requires_uniquekey\.php$ other_script.php [qsa,l]

以上規則將檢查裡面的uniquekey引數是否存在,如果值為script_that_requires_uniquekey,將會定向到新的url。 

10.刪除查詢變數

apache的mod_rewrite模組會自動辨識查詢變數,除非你做了以下改動: 

a).分配乙個新的查詢引數(你可以用[qsa,l]flag儲存最初的查詢變數) 

b).在檔名後面加乙個「?」(比如index.php?)。符號「?」不會在瀏覽器的位址列裡顯示。

11.用新的格式展示當前uri

如果這就是我們當前正在執行的urls:/index.php?id=nnnn。我們非常希望將其更改成/nnnn並且讓搜尋引擎以新格式展現。首先,我們為了讓搜尋引擎更新成新的,得將舊的urls重定向到新的格式,但是,我們還得保證以前的index.php照樣能夠執行。是不是被我搞迷糊了? 

實現以上

功能,訣竅就在於在查詢變數中加了乙個訪問者看不到的標記符「marker」。我們只將查詢變數中沒有出現「marker」標記的鏈結進行重定向,然後將原有的鏈結替換成新的格式,並且通過[qsa]flag在已有的引數加乙個「marker」標記。以下為實現的方式: 

rewritecond % !marker 

rewritecond % id=([-a-za-z0-9_+]+) 

rewriterule ^/?index\.php$ %1? [r=301,l] 

rewriterule ^/?([-a-za-z0-9_+]+)$ index.php?marker &id=$1 [l]

這裡,原先的url:

,不包含marker,所以被第乙個規則永久重定向到

,第二個規則將

反定向到

&id=nnnn,並且加了marker以及id=nnnn兩個變數,最後mod_rewrite就開始進行處理過程。

第二次匹配,marker被匹配,所以忽略第一條規則,這裡有乙個「.」字元會出現在

&id=nnnn中,所以第二條規則也會被忽略,這樣我們就完成了。

注意,這個

解決方案要求apache的一些擴充套件功能,所以如果你的**放於在共享主機中會遇到很多障礙。

12.保證安全服務啟用

apache可以用兩種方法辨別你是否開啟了安全服務,分別引用和變數: 

rewritecond % ^secure_page\.php$ 

rewritecond % !on 

rewriterule ^/?(secure_page\.php)$  [r=301,l]

以上規則測試值是否等於我們的安全頁**,並且不等於on。如果這兩個條件同時滿足,請求將被重定向到安全服務uri.另外你可用做同樣的測試,443是常用的安全服務埠 

rewritecond % ^secure_page\.php$ 

rewritecond % !^443$ 

rewriterule ^/?(secure_page\.php)$  [r=301,l]

13.在特定的頁面上強制執行安全服務 

遇到同乙個伺服器根目錄下分別有乙個安全服務網域名稱和乙個非安全服務網域名稱,所以你就需要用rewritecond 判斷安全服務埠是否占用,並且只將以下列表的頁面要求為安全服務: 

rewritecond % !^443$ 

rewriterule ^/?(page1|page2|page3|page4|page5)$  

以下是怎樣將沒有設定成安全服務的頁面返回到80埠: 

rewritecond % ^443$ 

rewriterule !^/?(page6|page7|page8|page9)$ [r=301,l]

1 3 第乙個 Android 應用

對專案的名稱 儲存路徑 使用的語言等進行相關設定 company domain 公司網域名稱 package name 包名 根據公司網域名稱生成的 minimum sdk api 21 android 5.0 lollipop 最低版本sdk 專案中可能會用到的一些檔案 其中 mainativiy...

13 括號匹配 棧的應用

下面簡單介紹一下棧的一些函式以及操作 include檔案頭 stackname 舉個例子 stacks int 是型別,s是變數。s.empty 判空函式,如果返回1,表示棧中為空。s.push 將元素壓入棧。s.pop 刪除棧頂元素,無返回值。若棧中無元素,呼叫後會報錯,需要判空。s.top 輸出...

實驗13 編寫 應用中斷例程

2 編寫並安裝int 7ch中斷例程,功能為完成loop指令的功能。引數 cx 迴圈次數,bx 位移。以上中斷例程安裝好後,對下面的程式進行單步跟蹤,尤其注意int,iret指令執行前後cs,ip的和棧中的狀態。assume cs code code segment start mov ax,0b8...