今天在調試一個think php的框架,我本地的服務器不支持跟目錄下.htaccess文件的RewriteRule,因而我就將.htaccess的內容拷貝到httpd.conf中進行配置,但配置後發現提示錯誤。html
Bad Request Your browser sent a request that this server could not understand.
.htaccess中的配置以下正則表達式
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] </IfModule>
猜想多是有絕對路徑緣由到只無效,因而配置改爲:thinkphp
RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ /index.php/$1 [QSA,PT,L] #index.php前面加了一斜槓
加上跟目錄斜槓之後,頁面能訪問,但新的問題又出現了,頁面中全部的js、css、圖片的地址都被轉向到了錯誤頁面上。可我明明在配置中已經說明了,若是文件或者目錄存在則不執行RewriteRule。代碼以下:apache
#此兩行代碼含義:若是文件存在,就直接訪問文件,不進行下面的RewriteRule. RewriteCond %{REQUEST_FILENAME} !-d #若是目錄存在就直接訪問,不進行RewriteRule RewriteCond %{REQUEST_FILENAME} !-f #若是文件存在就直接訪問,不進行RewriteRule
也能夠寫這個:服務器
RewriteCond %{REQUEST_FILENAME} !-s #若是文件存在並有大小,直接訪問。不進行RewriteRule
固然還能夠經過文件的後綴名來過濾框架
RewriteCond %{REQUEST_URI} !^.*(.css|.js|.gif|.png|.jpg|.jpeg)$ #這些後綴的文件,不進行RewriteRule
以上方法中,測試發現,除了最後經過後綴名來過濾來過濾的之外都無效,可經過後綴名來過濾並非個人初衷,經過查看RewriteLog日誌發現(經過在http.conf文件添加RewriteLog logs/rewrite.log來開啓RewriteLog日誌),一樣是由於相對路徑問題而致使的錯誤,因而在配置的時候加上文檔的根目錄。修改成以下配置:post
RewriteEngine on RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ /index.php/$1
測試成功!性能
總結,編寫Rewrite配置的時候,在http.conf文件裏面和在.htaccess文件裏面是有區別的,須要注意路徑問題,使用.htaccess是以.htaccess文件所在的目錄爲起始目錄,而在http.conf中編寫配置是,必定要加上文檔的根目錄,如「/」、「{DOCUMENT_ROOT}」等…
附錄:
RewriteCond 重寫規則執行條件:
語法: RewriteCond TestString CondPattern
生效域: server config, virtual host, directory, .htaccess
特別的上面的 TestString, 可提供反向引用. 引用模式爲: %N 其中N爲(0 <= N <=9), 引用當前若干RewriteCond條件中最後符合的條件中的分組成分, 也就是括號裏的內容.不過用到的很少. 反向應用多在RewriteRule裏經常使用.
RewriteCond 語法中的 TestStrng 爲要被檢查的內容, CondPattern 是進行匹配的規則, 它是一個兼容Perl風格的正則表達式和一些其餘的特有字符屬性. 這裏介紹一下.
第一個: ! (感嘆號) 表示否的意思. 好比一個條件: 判斷訪問此頁面的上一頁URL是否包含 sex 字符的話能夠用這樣: RewriteCond %{HTTP_REFERER} !(sex)
第二個: < 就是小於的意思, TestString < CondPattern.
第三個: > 就是大於於的意思, TestString < CondPattern.
第四個: = 相等的意思. <, >, = 三個和一般程序語言使用的 <, >, = 功能相似.
第五個: -d 是不是一個目錄. 判斷TestString是否不是一個目錄能夠這樣: !-d
第六個: -f 是不是一個文件. 判斷TestString是否不是一個文件能夠這樣: !-f
第七個: -s 是不是一個正常的有大小的文件. 判斷TestString是否不是一個正常的有大小的文件能夠這樣: !-s
第八個: -l 是不是一個快捷方式文件. 判斷TestString是否不是一個快捷方式文件能夠這樣: !-l
第九個: -x 是不是一個文件而且又執行權限. 判斷TestString是否不是一個文件而且又執行權限能夠這樣: !-x
第十個: -F 檢查TestString是不是一個合法的文件,並且經過服務器範圍內的當前設置的訪問控制進行訪問。這個檢查是經過一個內部subrequest完成的, 所以須要當心使用這個功能以下降服務器的性能。
第十一個: -U 檢查TestString是不是一個合法的URL,並且經過服務器範圍內的當前設置的訪問控制進行訪問。這個檢查是經過一個內部subrequest完成的, 所以須要當心使用這個功能以下降服務器的性能.