<ul id="g60s4"><pre id="g60s4"></pre></ul>
<strong id="g60s4"><nav id="g60s4"></nav></strong>
<ul id="g60s4"></ul>
  • <tr id="g60s4"></tr>
  • 
    
  • 或者

    Apache服務器偽靜態規則中htaccess語法解釋及用法

    作者:一只德德牛(團隊-快排) 瀏覽:126 發布時間:2017-09-14
    分享 評論 0

    apache服務器偽靜態規則htaccess語法解釋及用法,htaccess寫法是這樣的:

      RewriteEngineOnRewriteCond%{HTTP_HOST}^(www\.)?xxx\.com$RewriteCond%{REQUEST_URI}!^/blog/RewriteCond%{REQUEST_FILENAME}!-fRewriteCond%{REQUEST_FILENAME}!-dRewriteRule^(.*)$/blog/$1#沒有輸入文件名的默認到到首頁

      RewriteCond%{HTTP_HOST}^(www\.)?xxx\.com$RewriteRule^(/)?$blog/index.php[L]

      下面我開始解說一下上面的意思:

      【RewriteEngineOn】表示重寫引擎開,關閉off,作用就是方便的開啟或關閉以下的語句,這樣就不需要一條一條的注釋語句了。

      【RewriteCond%{HTTP_HOST}^(www\.)?xxx\.com$】

      這是重寫條件,前面%{HTTP_HOST}表示當前訪問的網址,只是指前綴部分,格式是www.xxx.com不包括“http://”和“/”,^表示字符串開始,$表示字符串結尾,\.表示轉義的.,如果不轉義也行,推薦轉義,防止有些服務器不支持,?表示前面括號www\.出現0次或1次,這句規則的意思就是如果訪問的網址是xxx.com或者www.xxx.com就執行以下的語句,不符合就跳過。

      【RewriteCond%{REQUEST_URI}!^/blog/】

      也是重寫條件,%{REQUEST_URI}表示訪問的相對地址,就是相對根目錄的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,這句語句表示訪問的地址不以/blog/開頭,只是開頭^,沒有結尾$【RewriteCond%{REQUEST_FILENAME}!-f】

      【RewriteCond%{REQUEST_FILENAME}!-d】

      這兩句語句的意思是請求的文件或路徑是不存在的,如果文件或路徑存在將返回已經存在的文件或路徑【RewriteRule^(.*)$/blog/$1】重寫規則,最重要的部分,意思是當上面的RewriteCond條件都滿足的時候,將會執行此重寫規則,^(.*)$是一個正則表達的匹配,匹配的是當前請求的URL,^(.*)$意思是匹配當前URL任意字符,.表示任意單個字符,*表示匹配0次或N次(N>0),后面/blog/$1是重寫成分,意思是將前面匹配的字符重寫成/blog/$1,這個$1表示反向匹配,引用的是前面第一個圓括號的成分,即^(.*)$中的.*,其實這兒將會出現一個問題,后面討論。

      【RewriteCond%{HTTP_HOST}^(www\.)?xxx\.com$】

      【RewriteRule^(/)?$blog/index.php[L]】

      這兩句的意思是指請求的host地址是www.xxx.com是,如果地址的結尾只有0個或者1個“/”時,將會重寫到子目錄下的主頁,我猜想這主要因為重寫后的地址是不能自動尋找主頁的,需要自己指定。

      現在說說出現的問題,RewriteRule^(.*)$/blog/$1前部分^(.*)$將會匹配當前請求的url,例如:請求網址是http://www.xxx.com/a.html,到底是匹配整個http://www.xxx.com/a.html,還是只匹配/a.html即反斜杠后面的成分,還是只匹配a.html。

      答案是:根據RewriteBase規則規定,如果rewritebase為/,將會匹配a.html,不帶前面的反斜杠,所以上條語句應該寫成RewriteRule^(.*)$blog/$1(不帶/),不過實際應用上帶上前面的反斜杠,也可以用,可能帶不帶都行。現在問題出來了,如果不設置rewritebase為/,將會匹配整個網址http://www.xxx.com/a.html,顯然這是錯誤的,所以應該添加這條:

      RewiteBase/

      還有一個問題是,不能保證每個人輸入的網址都是小寫的,如果輸入大寫的呢,linux系統是區分大小寫的,所以應該在RewriteCond后添加[NC]忽略大小寫的。

      至此,完整的語句應該是:

      ####start####

      RewriteEngineOn

      RewiteBase/

      RewriteCond%{HTTP_HOST}^(www\.)?xxx\.com$[NC]

      RewriteCond%{REQUEST_URI}!^/blog/

      RewriteCond%{REQUEST_FILENAME}!-f

      RewriteCond%{REQUEST_FILENAME}!-d

      RewriteRule^(.*)$blog/$1

      #沒有輸入文件名的默認到到首頁

      RewriteCond%{HTTP_HOST}^(www\.)?xxx\.com$[NC]

      RewriteRule^(/)?$blog/index.php[L]

      ####end####

      如果后面還繼續有語句的,就不應該加上最后的[L],因為這是表示最后一條語句的意思防盜鏈的語句,同樣需要添加RewiteBase/,如下:

      RewriteEngineon

      RewiteBase/

      RewriteCond%{HTTP_REFERER}!^$[NC]

      RewriteCond%{HTTP_REFERER}!xxx.info[NC]

      RewriteRule\.(jpg|gif|png|bmp|swf|jpeg)$/error/daolian.gif[R,NC,L]

      如果后面還繼續有語句的,就不應該加上最后的[L],/error/daolian.gif為別人盜鏈時顯示的圖片。

      下面附上簡單的語法規則和flags:

      【RewriteCond語法:】

      RewriteCondTestStringCondPattern[flags]

      rewritecond的其他用法:

      ‘-d’(目錄)

      將TestString視為一個路徑名并測試它是否為一個存在的目錄。

      ‘-f’(常規文件)

      將TestString視為一個路徑名并測試它是否為一個存在的常規文件。

      ‘-s’(非空的常規文件)

      將TestString視為一個路徑名并測試它是否為一個存在的、尺寸大于0的常規文件。

      ‘-l’(符號連接)

      將TestString視為一個路徑名并測試它是否為一個存在的符號連接。

      ‘-x’(可執行)

      將TestString視為一個路徑名并測試它是否為一個存在的、具有可執行權限的文件。該權限由操作系統檢測。

      ‘-F’(對子請求存在的文件)

      檢查TestString是否為一個有效的文件,而且可以在服務器當前的訪問控制配置下被訪問。它使用一個內部子請求來做檢查,由于會降低服務器的性能,所以請謹慎使用!

      ‘-U’(對子請求存在的URL)

      檢查TestString是否為一個有效的URL,而且可以在服務器當前的訪問控制配置下被訪問。它使用一個內部子請求來做檢查,由于會降低服務器的性能,所以請謹慎使用!

      【RewriteRule語法:】

      RewriteRulePatternSubstitution[flags]

      【flags】:

      ‘chain|C’(鏈接下一規則)

      此標記使當前規則與下一個規則相鏈接。它產生這樣的效果:如果一個規則被匹配,則繼續處理其后繼規則,也就是這個標記不起作用;如果該規則不被匹配,則其后繼規則將被跳過。比如,在一個目錄級規則中執行一個外部重定向時,你可能需要刪除”.www”(此處不應該出現”.www”)。

      ‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’(設置cookie)在客戶端設置一個cookie。cookie的名稱是NAME,值是VAL。domain是該cookie的域,比如’.apache.org’,可選的lifetime是cookie的有效期(分鐘),可選的path是cookie的路徑。

      ‘env|E=VAR:VAL’(設置環境變量)

      此標記將環境變量VAR的值為VAL,VAL可以包含可擴展的正則表達式反向引用($N和%N)。此標記可以多次使用以設置多個變量。這些變量可以在其后許多情況下被間接引用,通常是在XSSI(<!–#echovar=”VAR”–>)或CGI($ENV{‘VAR’})中,也可以在后繼的RewriteCond指令的CondPattern參數中通過%{ENV:VAR}引用。使用它可以記住從URL中剝離的信息。

      ‘forbidden|F’(強制禁止URL)

      強制禁止當前URL,也就是立即反饋一個HTTP響應碼403(被禁止的)。使用這個標記,可以鏈接若干個RewriteConds來有條件地阻塞某些URL。

      ‘gone|G’(強制廢棄URL)

      強制當前URL為已廢棄,也就是立即反饋一個HTTP響應碼410(已廢棄的)。使用這個標記,可以標明頁面已經被廢棄而不存在了。

      ‘handler|H=Content-handler’(強制指定內容處理器)強自制定目標文件的內容處理器為Content-handler。例如,用來模擬mod_alias模塊的ScriptAlias指令,以強制映射文件夾內的所有文件都由”cgi-script”處理器處理。

      ‘last|L’(結尾規則)

      立即停止重寫操作,并不再應用其他重寫規則。它對應于Perl中的last命令或C語言中的break命令。這個標記用于阻止當前已被重寫的URL被后繼規則再次重寫。例如,使用它可以重寫根路徑的URL(‘/’)為實際存在的URL(比如:’/e/www/’)。

      ‘next|N’(從頭再來)

      重新執行重寫操作(從第一個規則重新開始)。此時再次進行處理的URL已經不是原始的URL了,而是經最后一個重寫規則處理過的URL。它對應于Perl中的next命令或C語言中的continue命令。此標記可以重新開始重寫操作(立即回到循環的開頭)。但是要小心,不要制造死循環!

      ‘nocase|NC’(忽略大小寫)

      它使Pattern忽略大小寫,也就是在Pattern與當前URL匹配時,’A-Z’和’a-z’沒有區別。

      ‘noescape|NE’(在輸出中不對URI進行轉義)

      此標記阻止mod_rewrite對重寫結果應用常規的URI轉義規則。一般情況下,特殊字符(‘%’,‘$’,‘;’等)會被轉義為等值的十六進制編碼(‘%′,‘$′,‘;’等)。此標記可以阻止這樣的轉義,以允許百分號等符號出現在輸出中,比如:

      RewriteRule/foo/(.*)/bar?arg=P1\=$1[R,NE]

      可以使’/foo/zed轉向到一個安全的請求’/bar?arg=P1=zed’。

      ‘nosubreq|NS’(不對內部子請求進行處理)

      在當前請求是一個內部子請求時,此標記強制重寫引擎跳過該重寫規則。比如,在mod_include試圖搜索目錄默認文件(index.xxx)時,Apache會在內部產生子請求。對于子請求,重寫規則不一定有用,而且如果整個規則集都起作用,它甚至可能會引發錯誤。所以,可以用這個標記來排除某些規則。

      使用原則:如果你為URL添加了CGI腳本前綴,以強制它們由CGI腳本處理,但對子請求處理的出錯率(或者資源開銷)很高,在這種情況下,可以使用這個標記。

      ‘proxy|P’(強制為代理)

      此標記使替換成分被內部地強制作為代理請求發送,并立即中斷重寫處理,然后把處理移交給mod_proxy模塊。你必須確保此替換串是一個能夠被mod_proxy處理的有效URI(比如以http://hostname開頭),否則將得到一個代理模塊返回的錯誤。使用這個標記,可以把某些遠程成分映射到本地服務器域名空間,從而增強了ProxyPass指令的功能。

      注意:要使用這個功能,必須已經啟用了mod_proxy模塊。

      ‘passthrough|PT’(移交給下一個處理器)

      此標記強制重寫引擎將內部request_rec結構中的uri字段設置為filename字段的值,這個小小的修改使得RewriteRule指令的輸出能夠被(從URI轉換到文件名的)Alias,ScriptAlias,Redirect等指令進行后續處理[原文:Thisflagisjustahacktoenablepost-processingoftheoutputofRewriteRuledirectives,usingAlias,ScriptAlias,Redirect,andotherdirectivesfromvariousURI-to-filenametranslators.]。

      舉一個能說明其含義的例子:如果要將/abc重寫為/def,然后再使用mod_alias將/def轉換為/ghi,可以這樣:

      RewriteRule^/abc(.*)/def$1[PT]

      Alias/def/ghi

      如果省略了PT標記,雖然將uri=/abc/…重寫為filename=/def/…的部分運作正常,但是后續的mod_alias在試圖將URI轉換到文件名時會遭遇失效。

      注意:如果需要混合使用多個將URI轉換到文件名的模塊時,就必須使用這個標記。。此處混合使用mod_alias和mod_rewrite就是個典型的例子。

      ‘qsappend|QSA’(追加查詢字符串)

      此標記強制重寫引擎在已有的替換字符串中追加一個查詢字符串,而不是簡單的替換。如果需要通過重寫規則在請求串中增加信息,就可以使用這個標記。

      ‘redirect|R[=code]‘(強制重定向)

      若Substitution以http://thishost[:thisport]/(使新的URL成為一個URI)開頭,可以強制性執行一個外部重定向。如果沒有指定code,則產生一個HTTP響應碼302(臨時性移動)。如果需要使用在300-400范圍內的其他響應代碼,只需在此指定即可(或使用下列符號名稱之一:temp(默認),permanent,seeother)。使用它可以把規范化的URL反饋給客戶端,如將”/~”重寫為”/u/”,或始終對/u/user加上斜杠,等等。

      注意:在使用這個標記時,必須確保該替換字段是一個有效的URL。否則,它會指向一個無效的位置!并且要記住,此標記本身只是對URL加上http://thishost[:thisport]/前綴,重寫操作仍然會繼續進行。通常,你還會希望停止重寫操作而立即重定向,那么就還需要使用’L'標記。

      ‘skip|S=num’(跳過后繼規則)

      此標記強制重寫引擎跳過當前匹配規則之后的num個規則。它可以模擬if-then-else結構:最后一個規則是then從句,而被跳過的skip=N個規則是else從句。注意:它和’chain|C’標記是不同的!

      ‘type|T=MIME-type’(強制MIME類型)

      強制目標文件的MIME類型為MIME-type,可以用來基于某些特定條件強制設置內容類型。比如,下面的指令可以讓.php文件在以.phps擴展名調用的情況下由mod_php按照PHP源代碼的MIME類型(application/x-httpd-php-source)顯示:

      RewriteRule^(.+\.php)s$$1[T=application/x-httpd-php-source]


    99亚洲乱人伦aⅴ精品| 69pao精品视频在线观看| 8x福利精品第一导航| 中日韩美中文字幕| 精品国产一区在线观看| 久热爱精品视频线路一| 久久久久久精品免费看SSS| 乱码精品一区二区三区| 秋霞久久国产精品电影院| 国内精品无码一区二区三区| 精品国产福利尤物免费| 国产91在线精品| 亚洲精品偷拍视频免费观看| 亚洲av日韩综合一区久热| 日韩a毛片免费观看| 国产成人综合色视频精品| 热99re久久精品精品免费| 国产精品久久久久乳精品爆| 精品久久久久久无码人妻中文字幕| 高清精品一区二区三区一区| 亚洲色无码国产精品网站可下载| 69国产成人综合久久精品| 亚洲男人的天堂久久精品| 精品国产一区二区三区无码| 亚洲国产高清在线精品一区| 亚洲视频精品在线观看| 91久久精品电影| 日本尤物精品视频在线看| 精品高潮呻吟99av无码视频| 精品日产卡一卡二卡麻豆| 亚洲午夜精品国产电影在线观看| 亚洲精品中文字幕乱码| 2022国产成人福利精品视频| 久久精品人妻中文系列| 国产精品久久自在自线观看| 国产福利91精品一区二区三区| 国产精品久久波多野结衣| 国产精品大bbwbbwbbw| 91成人午夜在线精品| 亚洲精品无码久久久久YW| 国产精品欧美成人|