apache url rewrite問題

apache RewriteEngine Your browser sent a request that this server could not understandphp

http://www.rainleaves.com/html/1569.htmlcss

在httpd.conf中設置%{REQUEST_FILENAME} !-f無效解決方法

今天在調試一個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完成的, 所以須要當心使用這個功能以下降服務器的性能.

轉載請註明本文連接: http://www.rainleaves.com/html/1569.html

 

ThinkPHP隱藏index.php出現No input file specified的解決方法

由於在Fastcgi模式下,php不支持rewrite的目標網址的PATH_INFO的解析
ThinkPHP運行在URL_MODEL=2時,會出現 No input file specified.的狀況,
這時能夠修改網站目錄的.htaccess文件:
 
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] 
改成 RewriteRule ^(.*)$ index.php?s=$1 [QSA,PT,L] 
 
完整的.htaccess代碼爲:
  1. 複製代碼
    <IfModule mod_rewrite.c>
      Options +FollowSymlinks
      RewriteEngine On
    
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteCond %{REQUEST_FILENAME} !-f
      #RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
      RewriteRule ^(.*)$ index.php?s=$1 [QSA,PT,L]
    </IfModule>
    複製代碼
相關文章
相關標籤/搜索