首頁  >  文章  >  後端開發  >  講解RewriteCond和13個mod_rewrite應用舉例Apache偽靜態 的相關知識

講解RewriteCond和13個mod_rewrite應用舉例Apache偽靜態 的相關知識

jacklove
jacklove原創
2018-06-11 10:58:312212瀏覽

1.給子網域加上www標記 
RewriteCond %{HTTP_HOST} ^([a-z.] )?example\.com$ [NC] 
#RewriteCond %{HTTP_HOST} !^www\. [ NC] 
RewriteRule .? http://www.xample.com%{REQUEST_URI} [R=301,L] 
這個規則抓取二級域名的%1變量,如果不是以www開始,那麼就加www,以前的網域以及{REQUEST_URI}會跟在其後。
2.去掉網域的www標記 
RewriteCond %{HTTP_HOST} !^example\.com$ [NC] 
RewriteRule .? http://example.com%{REQUEST_URI} [R= 301,L] 
3.去掉www標記,但儲存子網域 
RewriteCond %{HTTP_HOST} ^www\.(([a-z0-9_] \.)?example\.com) $ [NC] 
RewriteRule .? http://%1%{REQUEST_URI} [R=301,L] 
這裡,當配對到1%變數以後,子網域才會在%2(內部原子)中抓取到,而我們需要的正是這個%1變數。 
4.防止圖片盜鏈
一些站長不擇手段的將你的圖片盜鏈在他們網站上,耗費你的頻寬。你可以加一下程式碼來阻止這種行為。
RewriteCond %{HTTP_REFERER} !^$ 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?example\.com/ [NC] 
RewriteRule \.(gif|jpg| png)$ - [F] 
如果{HTTP_REFERER}值不為空,或者不是來自你自己的域名,這個規則用[F]FLAG阻止以gif|jpg|png 結尾的URL 
如果對這種盜鏈你是堅決鄙視的,你還可以改變圖片,讓訪問盜鏈網站的用戶知道該網站正在盜用你的圖片。
RewriteCond %{HTTP_REFERER} !^$ 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?example\.com/.*$ [NC] 
RewriteRule \.(gif |jpg|png)$ 你的圖片地址[R=301,L] 
除了阻止圖片盜鏈鏈接,以上規則將其盜鏈的圖片全部替換成了你設置的圖片。
你也可以阻止特定網域盜鏈你的圖片: 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?leech_site\.com/ [NC] 
RewriteRule \.( gif|jpg|png)$ - [F,L] 
這個規則將阻止網域名稱黑名單上所有的圖片連結請求。 
當然以上這些規則都是以{HTTP_REFERER}取得網域為基礎的,如果你想改用成IP位址,用{REMOTE_ADDR}就可以了。
5.如果檔案不存在重定向到404頁面 
如果你的主機沒有提供404頁面重定向服務,那麼我們自己創建。
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-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 %{REQUEST_FILENAME}.php - f 
RewriteRule ^/?([a-zA-Z0-9] )$ $1.php [L] 
RewriteCond %{REQUEST_FILENAME}.html -f 
RewriteRule ^/?([a-zA -Z0-9] )$ $1.html [L] 
如果檔案是以.php為後綴,這條規則將會被執行。
9.檢查查詢變數裡的特定參數 
如果在URL裡面有一個特殊的參數,你可用RewriteCond鑑別其是否存在: 
RewriteCond %{QUERY_STRING} !uniquekey= 
RewriteRule ^/?script_that_requires_uniquekey\.php$ other_script.php [QSA,L php
以上規則將檢查{QUERY_STRING}裡面的uniquekey參數是否存在,如果{REQUEST_URI}值為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 %{QUERY_STRING} !marker 
RewriteCond %{QUERY_STRING} id=([-a-zA-Z0-9_ ] ) 
RewriteRule ^/?index\.php$ %1? [R=301,L] 
RewriteRule ^/?([-a-zA-Z0-9_ ] )$ index.php?marker &id=$1 [L]
這裡,原先的URL: http://www.example.com/index.php?id=nnnn,不包含marker,所以被第一個規則永久重定向到http://www.example.com/nnnn,第二個規則將http ://www.example.com/nnnn反定向到http://www.example.com/index.php?marker&id=nnnn,並且加了marker以及id=nnnn兩個變量,最後mod_rewrite就開始進行處理過程。
第二次匹配,marker被匹配,所以忽略第一條規則,這裡有一個“.”字符會出現在http://www.example.com/index.php?marker &id=nnnn中,所以第二條規則也會被忽略,這樣我們就完成了。
注意,這個解決方案要求Apache的一些擴充功能,所以如果你的網站放於在共享主機中會遇到很多障礙。
12.確保安全服務啟用 
Apache可以用兩種方法來辨別你是否開啟了安全服務,分別引用{HTTPS}和{SERVER_PORT}變數: 
RewriteCond %{ REQUEST_URI} ^secure_page\.php$ 
RewriteCond %{HTTPS} !on 
RewriteRule ^/?(secure_page\.php)$ https://www.example.com/$1 [R=301,L]
以上規則測試{REQUEST_URI}值是否等於我們的安全頁碼,且{HTTPS}不等於on。如果這兩個條件同時滿足,請求將被重定向到安全服務URI.另外你可用{SERVER_PORT}做同樣的測試,443是常用的安全服務端口 
RewriteCond %{REQUEST_URI} ^secure_page\.php$
RewriteCond %{SERVER_PORT} !^443$ 
RewriteRule ^/?(secure_page\.php)$ https://www.example.com/$1 [R=301,L]
13.在特定的頁面上強制執行安全服務 
遇到同一個伺服器根目錄下分別有一個安全服務域名和一個非安全服務域名,所以你就需要用RewriteCond 判斷安全服務端口是否佔用,並且只將以下清單的頁面要求為安全服務: 
RewriteCond %{SERVER_PORT} !^443$ 
RewriteRule ^/?(page1|page2|page3|page4|page5)$ https://www .example.com/%1[R=301,L] 
以下是如何將沒有設定成安全服務的頁面回到80埠: 
RewriteCond %{ SERVER_PORT } ^443$ 
RewriteRule !^ /?(page6|page7|page8|page9)$http://www.example.com%{REQUEST_URI} [R=301,L]
  

#本文解說了RewriteCond與13個mod_rewrite應用舉例Apache偽靜態的相關知識,更多相關內容請關注php中文網。

相關推薦:

了解正向代理與反向代理的差異

如何使用Apache 建構虛擬主機

#如何透過sh memcached 進程啟動及監控

#

以上是講解RewriteCond和13個mod_rewrite應用舉例Apache偽靜態 的相關知識的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn