.htaccess的配置詳細詳解

來源:互聯網
上載者:User

.htaccess的配置詳細詳解

1.開啟mod_rewrite
將#LoadModule rewrite_module modules/mod_rewrite.so
這行的#去掉

2.修改httpd.conf
1)將你的網站目錄配置中的
AllowOverride None 改為AllowOverride All

2)修改Options的屬性
建議改為Indexes FollowSymLinks

FollowSymLinks
伺服器允許在此目錄中使用符號串連。
Indexes
如果一個映射到目錄的URL被請求,而此目錄中又沒有DirectoryIndex(例如:index.html),那麼伺服器會返回由mod_autoindex產生的一個格式化後的目錄列表。
說明:由於目前apache2.2版本以後Options預設的值是None,導致啟用.htaccess後出現403錯誤。這個問題困擾了很久,因為開始沒有注意到這個問題。所有很長時間在本地無法測試re_write功能的程式。

昨天晚上看apache的error.log時看到
[Sat Aug 09 23:06:19 2008] [error] [client 127.0.0.1] Options FollowSymLinks or SymLinksIfOwnerMatch is off which implies that RewriteRule directive is forbidden: G:/hekey/www/111/post/0, referer: http://localhost/111/admin.php教程?go=misc_urlrewrite
錯誤的時候才知道是Options的問題


--------------------------------------------------------------------------------

在網上找了很多篇關於配置apache mod_rewrite的文章,發覺這篇最有用,大家需要的可參考一下。

1,通過php提供的phpinfo()函數查看環境配置,通過Ctrl+F尋找到“Loaded Modules”,其中列出了所有apache2handler已經開啟的模組,如果裡麵包括“mod_rewrite”,則已經支援,不再需要繼續設定。
如果沒有開啟“mod_rewrite”,則開啟目錄 您的apache安裝目錄“/apache/conf/” 下的 httpd.conf 檔案,通過Ctrl+F尋找到“LoadModule rewrite_module”,將前面的”#”號刪除即可。如果沒有尋找到,則到“LoadModule” 地區,在最後一行加入“LoadModule rewrite_module modules/mod_rewrite.so”(必選獨佔一行),然後重啟apache伺服器即可。

2, 讓apache伺服器支援”.htaccess”
如何讓自己的本地APACHE伺服器支援”.htaccess”呢?其實只要簡單修改一下apache的httpd.conf設定就可以讓APACHE支 持.htaccess了。開啟httpd.conf檔案(在那裡? APACHE目錄的CONF目錄裡面),用文字編輯器開啟後,尋找
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
改為
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
就可以了

3,建立 “.htaccess” 檔案
如果是在windows平台下,剛開始還真不知道怎麼建立”.htaccess”檔案,因為這個檔案實際上沒有檔案名稱,僅僅只有副檔名,通過普通方式是無法建立這個檔案的,別著急,馬上告訴你三種方法:
三種方法都是先建立一個htaccess.txt的文字檔(當然,這個文字檔的名字你可以隨便取),然後有三種方式給這個檔案重新命名:(1)用記事本開啟,點擊檔案–另存新檔,在檔案名稱視窗輸入”.htaccess”,注意是整個綠色部分,也就是包含英文引號,然後點擊儲存就行了。(2)進入cmd命令視窗,通過cd切換當剛建立htaccess.txt檔案的檔案夾,然後輸入命令:rename htaccess.txt .htaccess ,然後點擊鍵盤Enter鍵即可。(3)通過ftp串連htaccess.txt所在檔案夾,通過ftp軟體重新命名。
那麼我們須要建立幾個“.htaccess” 檔案,裡面又輸入什麼內容呢?基本的原則是這樣,根目錄必須有一個,用於重新導向(URl重寫)所有的請求都會轉到到index.php(交給前端控制 器);”./application”檔案夾下須要一個,用於拒絕所有針對該檔案夾內容的直接存取(比如 http://localhost/application/models/User.php),這樣做是因為所有訪問請求必選通過前端控制器來分配訪問,其次為了安全;“./library”檔案夾下的“.htaccess”同前;”./public”檔案夾下必選建一個,因為這個檔案夾的檔案全部是供前端直接存取的,因此須要撤銷URl重寫。以下是4個“./htaccess”檔案的內容:
./.htaccess
RewriteEngine on
RewriteRule !/.(js|ico|gif|jpg|png|css教程)$ index.php
./application/.htaccess
deny from all
./library/.htaccess
deny from all
./public
RewriteEngine off
實際上,apache的url重寫功能也可以直接在httpd.conf檔案中進行設定,這裡就不具體講了,網上相關的教程也很多。


--------------------------------------------------------------------------------

rewrite標誌

R[=code](force redirect) 強制外部重新導向
強制在替代字串加上http://thishost[:thisport]/首碼重新導向到外部的URL.如果code不指定,將用預設的302 HTTP狀態代碼。
F(force URL to be forbidden)禁用URL,返回403HTTP狀態代碼。
G(force URL to be gone) 強制URL為GONE,返回410HTTP狀態代碼。
P(force proxy) 強制使用代理轉寄。
L(last rule) 表明當前規則是最後一條規則,停止分析以後規則的重寫。
N(next round) 重新從第一條規則開始運行重寫過程。
C(chained with next rule) 與下一條規則關聯
如果規則匹配則正常處理,該標誌無效,如果不匹配,那麼下面所有關聯的規則都跳過。
T=MIME-type(force MIME type) 強制MIME類型
NS (used only if no internal sub-request) 只用於不是內部子請求
NC(no case) 不區分大小寫
QSA(query string append) 追加請求字串
NE(no URI escaping of output) 不在輸出轉義特殊字元
例如:RewriteRule /foo/(.*) /bar?arg=P1/%3d$1 [R,NE] 將能正確的將/foo/zoo轉換成/bar?arg=P1=zed
PT(pass through to next handler) 傳遞給下一個處理
例如:
RewriteRule ^/abc(.*) /def$1 [PT] # 將會交給/def規則處理
Alias /def /ghi
S=num(skip next rule(s)) 跳過num條規則
E=VAR:VAL(set environment variable) 設定環境變數

rewrite時伺服器變數:
HTTP headers:HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_HOST, HTTP_ACCEPT
connection & request: REMOTE_ADDR, QUERY_STRING
server internals: DOCUMENT_ROOT, SERVER_PORT, SERVER_PROTOCOL
system stuff: TIME_YEAR, TIME_MON, TIME_DAY

Rewrite規則運算式的說明:
. 匹配任何單字元
[chars] 匹配字串:chars
[^chars] 不匹配字串:chars
text1|text2 可選擇的字串:text1或text2
? 匹配0到1個字元
* 匹配0到多個字元
+ 匹配1到多個字元
^ 字串開始標誌
$ 字串結束標誌
/n 轉義符標誌

反向引用 $N 用於 RewriteRule 中匹配的變數調用(0 <= N <= 9)
反向引用 %N 用於 RewriteCond 中最後一個匹配的變數調用(1 <= N <= 9)

RewriteCond標誌符
'nocase|NC'(no case)忽略大小
'ornext|OR' (or next condition)邏輯或,可以同時匹配多個RewriteCond條件

RewriteRule適用的標誌符  http//:www.zhutiai.com
'redirect|R [=code]' (force redirect)強迫重寫為基於http開頭的外部轉向(注意URL的變化) 如:[R=301,L]
'forbidden|F' (force URL to be forbidden)重寫為禁止訪問
'proxy|P' (force proxy)重寫為通過代理訪問的http路徑
'last|L' (last rule)最後的重寫規則標誌,如果匹配,不再執行以後的規則
'next|N' (next round)迴圈同一個規則,直到不能滿足匹配
'chain|C' (chained with next rule)如果匹配該規則,則繼續下面的有Chain標誌的規則。
'type|T=MIME-type' (force MIME type)指定MIME類型
'nosubreq|NS' (used only if no internal sub-request)如果是內部子請求則跳過
'nocase|NC' (no case)忽略大小
'qsappend|QSA' (query string append)附加查詢字串
'noescape|NE' (no URI escaping of output)禁止URL中的字元自動轉義成%[0-9]+的形式。
'passthrough|PT' (pass through to next handler)將重寫結果運用於mod_alias
'skip|S=num' (skip next rule(s))跳過下面幾個規則
'env|E=VAR:VAL' (set environment variable)添加環境變數

實際操作

例子:
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^MSIE [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Opera [NC]
RewriteRule ^.* - [F,L] 這裡”-”表示沒有替換,瀏覽器為IE和Opera的訪客將被禁止訪問。

例子:
RewriteEngine On
RewriteBase /test
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ([^/]+)$ /test/$1.php
#for example: /test/admin => /test/admin.php
RewriteRule ([^/]+)/.html$ /test/$1.php [L]
#for example: /test/admin.html => /test/admin.php

限制目錄只能顯示圖片
< IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !^.*/.(gif|jpg|jpeg|png|swf)$
RewriteRule .*$ - [F,L]
< /IfModule>

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.