PHP擴展模塊、Apache之rewrite模塊

11.32 php動態擴展模塊安裝

注: 本節操做使用PHP7。php

查看PHP模塊:html

[root@1 ~]# /usr/local/php/bin/php -m

安裝Redis模塊

redis是一個key-value存儲系統。和Memcached相似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)和zset(有序集合)。git

準備工做:

[root@1 ~]# cd /usr/local/src  

下載Redis安裝包: 
[root@1 src]# wget https://codeload.github.com/phpredis/phpredis/zip/develop 

重命名:
[root@1 src]# mv develop phpredis-develop.zip

解壓:
[root@1 src]# unzip phpredis-develop.zip 

[root@1 src]# cd phpredis-develop/  

[root@1 phpredis-develop]# /usr/local/php7/bin/phpize
#執行該命令的目的是生成configure文件,不然沒法進行編譯安裝

報錯:
Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.

解決辦法:  
[root@1 phpredis-develop]# yum install -y autoconf

[root@1 phpredis-develop]# /usr/local/php7/bin/phpize 
Configuring for:
PHP Api Version:         20160303
Zend Module Api No:      20160303
Zend Extension Api No:   320160303

開始安裝

環境配置

[root@1 phpredis-develop]# ./configure --with-php-config=/usr/local/php7/bin/php-config

編譯&安裝

[root@1 phpredis-develop]# make

[root@1 phpredis-develop]# make install
Installing shared extensions:     /usr/local/php7/lib/php/extensions/no-debug-zts-20160303/

[root@1 phpredis-develop]# ls /usr/local/php7/lib/php/extensions/no-debug-zts-20160303/
opcache.so  redis.so

爲PHP加載Redis模塊

先查看擴展模塊所在目錄:github

[root@1 phpredis-develop]# /usr/local/php7/bin/php -i|grep extension_dir
extension_dir => /usr/local/php7/lib/php/extensions/no-debug-zts-20160303 => /usr/local/php7/lib/php/extensions/no-debug-zts-20160303
sqlite3.extension_dir => no value => no value

說明: 該目錄能夠在PHP配置文件php.ini中進行設置(保持默認)。正則表達式

加載Redis模塊

編輯PHP的配置文件:redis

[root@1 phpredis-develop]# vim /usr/local/php7/etc/php.ini

; If you wish to have an extension loaded automatically, use the following
; syntax:
; ... or under UNIX:
;
;   extension=msql.so
   extension=redis.so
   
[root@1 phpredis-develop]# /usr/local/php7/bin/php -m |grep redis
redis

說明: 在配置文件中加入「extension=redis.so」便可!該文件中「;」表示註釋符號,同「#」。sql

關於擴展板塊

在PHP的源碼包中沒有第三方模塊的包,可是在PHP源碼包的/ext/目錄下有好多擴展模塊,若是所須要的擴展模塊在該目錄下,能夠直接進行安裝:apache

先切換到指定模塊目錄下,而後進行以下操做:

生成configure文件:
[root@1 phpredis-develop]# /usr/local/php7/bin/phpize

環境配置:
[root@1 phpredis-develop]# ./configure --with-php-config=/usr/local/php7/bin/php-config

編譯:
[root@1 phpredis-develop]# make

安裝:
[root@1 phpredis-develop]# make install

安裝完成後在編輯php.ini進行配置!

擴展:

apache rewrite教程

rewrite engine會對每條rewrite規則進行解析,每條rewrite規則能夠帶或不帶rewrite condition, 帶的話寫在該條rewrite規則以前。若是rewrite規則符合,會進一步檢查rewrite condition.具體處理以下:vim

  • 首先匹配rewrite的patern,若不匹配則進入下一條rewrite rule。
  • 若是匹配,則mod_rewrite檢查rewrite condition, 若是沒有condition,則新的string將替換url,而後進入下一條rewrite rule.
  • 若是rewrite condition存在,則按順序檢查conditions。 Condition的 匹配並非對url的,而是針對擴展變量等。conditons之間默認是AND的關係,也就是說conditon只要有一條不匹配,則退出匹配;當一條 條件被匹配後,則檢查下一條,直到不匹配爲止,若是全部條件匹配,替換就會進行。

測試條件:

-f文件存在;
-d目錄存在;
-l是連接文件(symbol link);
-s文件大小非0api

rewrite rule的參數:

  1. RewriteCond指令格式

語法: RewriteCond TestString CondPattern
eg:「RewriteCond %{HTTP_HOST} ^ ww.example.net [NC]」

  • TestString是一個純文本的字符串,可是能夠包含可擴展的成分
  • CondPattern是條件pattern, 即一個應用於當前實例TestString的正則表達式, 即TestString將會被計算而後與CondPattern匹配.
  • 另外,還能夠爲CondPattern追加特殊的標記[flags] 做爲RewriteCond指令的第三個參數。Flags是一個以逗號分隔的如下標記的列表:
    • ‘nocase|NC’ 它使測試忽略大小寫, 即TestString和CondPattern無大小寫檢查
    • ‘ornext|OR’ 它以OR方式組合若干規則的條件,而不是隱含的AND。
  1. RewriteRule 指令

語法: RewriteRule Pattern Substitution
eg: RewriteRule ^(.*)$ http://www.9med.net/$1 [R=permanent,L]

  • Pattern是一個做用於當前URL的兼容perl的正則表達式. 這裏的「當前」是指該規則生效時的URL的值。
  • Substitution是,當原始URL與Pattern相匹配時,用以替代(或替換)的字符串。
  • 此外,Substitution還能夠追加特殊標記[flags] 做爲RewriteRule指令的第三個參數。 Flags是一個包含以逗號分隔的下列標記的列表:
    • ‘redirect|R [=code]‘
      (強制重定向 redirect) 以http://thishost[:thisport]/(使新的URL成爲一個URI) 爲前綴的Substitution能夠強制性執行一個外部重定向。 若是code沒有指定,則產生一個HTTP響應代碼302(臨時性移動)。 若是須要使用在300-400範圍內的其餘響應代碼,只需在此指定這個數值便可, 另外,還可使用下列符號名稱之一: temp (默認的), permanent, seeother. 用它能夠把規範化的URL反饋給客戶端,如, 重寫「/~」爲 「/u/」,或對/u/user加上斜槓,等等。
      注意: 在使用這個標記時,必須確保該替換字段是一個有效的URL! 不然,它會指向一個無效的位置! 而且要記住,此標記自己只是對URL加上 http://thishost[:thisport]/的前綴,重寫操做仍然會繼續。 一般,你會但願中止重寫操做而當即重定向,則還須要使用’L’標記。

    • ‘forbidden|F’ (強制URL爲被禁止的 forbidden)
      強制當前URL爲被禁止的,即,當即反饋一個HTTP響應代碼403(被禁止的)。 使用這個標記,能夠連接若干RewriteConds以有條件地阻塞某些URL。

    • ‘gone|G’ (強制URL爲已廢棄的 gone)
      強制當前URL爲已廢棄的,即,當即反饋一個HTTP響應代碼410(已廢棄的)。 使用這個標記,能夠標明頁面已經被廢棄而不存在了。

    • ‘proxy|P’ (強制爲代理 proxy)
      此標記使替換成分被內部地強制爲代理請求,並當即(即, 重寫規則處理當即中斷)把處理移交給代理模塊。 你必須確保此替換串是一個有效的(好比常見的以 http://hostname開頭的)可以爲Apache代理模塊所處理的URI。 使用這個標記,能夠把某些遠程成分映射到本地服務器名稱空間, 從而加強了ProxyPass指令的功能。
      注意: 要使用這個功能,代理模塊必須編譯在Apache服務器中。 若是你不能肯定,能夠檢查「httpd -l」的輸出中是否有mod_proxy.c。 若是有,則mod_rewrite可使用這個功能;若是沒有,則必須啓用mod_proxy並從新編譯「httpd」程序。

    • ‘last|L’ (最後一個規則 last)
      當即中止重寫操做,並再也不應用其餘重寫規則。 它對應於Perl中的last命令或C語言中的break命令。 這個標記能夠阻止當前已被重寫的URL爲其後繼的規則所重寫。 舉例,使用它能夠重寫根路徑的URL(‘/’)爲實際存在的URL, 好比, ‘/e/www/’。

    • ‘next|N’ (從新執行 next round)
      從新執行重寫操做(從第一個規則從新開始)。這時再次進行處理的URL已經不是原始的URL了,而是經最後一個重寫規則處理的URL。 它對應於Perl中的next命令或C語言中的continue命令。 此標記能夠從新開始重寫操做,即,當即回到循環的頭部。可是要當心,不要製造死循環!

    • ‘chain|C’ (與下一個規則相連接 chained)
      此標記使當前規則與下一個(其自己又能夠與其後繼規則相連接的, 並能夠如此反覆的)規則相連接。 它產生這樣一個效果: 若是一個規則被匹配,一般會繼續處理其後繼規則, 即,這個標記不起做用;若是規則不能被匹配, 則其後繼的連接的規則會被忽略。好比,在執行一個外部重定向時, 對一個目錄級規則集,你可能須要刪除「.www」 (此處不該該出現「.www」的)。

    • ‘type|T=MIME-type’ (強制MIME類型 type)
      強制目標文件的MIME類型爲MIME-type。 好比,它能夠用於模擬mod_alias中的ScriptAlias指令,之內部地強制被映射目錄中的全部文件的MIME類型爲「application/x-httpd-cgi」。

    • ‘nosubreq|NS’ (僅用於不對內部子請求進行處理 no internal sub-request)
      在當前請求是一個內部子請求時,此標記強制重寫引擎跳過該重寫規則。 好比,在mod_include試圖搜索可能的目錄默認文件(index.xxx)時, Apache會內部地產生子請求。對子請求,它不必定有用的,並且若是整個規則集都起做用, 它甚至可能會引起錯誤。因此,能夠用這個標記來排除某些規則。根據你的須要遵循如下原則: 若是你使用了有CGI腳本的URL前綴,以強制它們由CGI腳本處理, 而對子請求處理的出錯率(或者開銷)很高,在這種狀況下,可使用這個標記。

    • ‘nocase|NC’ (忽略大小寫 no case)
      它使Pattern忽略大小寫,即,在Pattern與當前URL匹配時,’A-Z’ 和’a-z’沒有區別。

    • ‘qsappend|QSA’ (追加請求串 query string append)
      此標記強制重寫引擎在已有的替換串中追加一個請求串,而不是簡單的替換。 若是須要經過重寫規則在請求串中增長信息,就可使用這個標記。

    • ‘noescape|NE’ (在輸出中不對URI做轉義 no URI escaping)
      此標記阻止mod_rewrite對重寫結果應用常規的URI轉義規則。 通常狀況下,特殊字符(如’%’,‘$’,‘;’等)會被轉義爲等值的十六進制編碼。 此標記能夠阻止這樣的轉義,以容許百分號等符號出如今輸出中,如:RewriteRule /foo/(.*)/bar?arg=P1%3d$1[R,NE]可使’/foo/zed’轉向到一個安全的請求’/bar?arg=P1=zed’。

    • ‘passthrough|PT’ (移交給下一個處理器 pass through)
      此標記強制重寫引擎將內部結構request_ rec中的uri字段設置爲filename字段的值,它只是一個小修改,使之能對來自其餘URI到文件名翻譯器的 Alias,ScriptAlias, Redirect 等指令的輸出進行後續處理。舉一個能說明其含義的例子: 若是要經過mod_ rewrite的重寫引擎重寫/abc爲/def,而後經過mod_ alias使/def轉變爲/ghi,能夠這樣:RewriteRule ^/abc(.*) /def$1 [PT] Alias /def/ghi,若是省略了PT標記,雖然mod_ rewrite運做正常,即,做爲一個使用API的URI到文件名翻譯器,它能夠重寫uri=/abc/…爲filename=/def/…,可是,後續的mod_alias在試圖做URI到文件名的翻譯時,則會失效。
      注意: 若是須要混合使用不一樣的包含URI到文件名翻譯器的模塊時, 就必須使用這個標記。混合使用mod_ alias和mod_rewrite就是個典型的例子。

    • ‘skip|S=num’ (跳事後繼的規則 skip)
      此標記強制重寫引擎跳過當前匹配規則後繼的num個規則。它能夠實現一個僞if-then-else的構造:最後一個規則是then從句,而被跳過的skip=N個規則是else從句。(它和’chain|C’標記是不一樣的!)

    • ‘env|E=VAR:VAL’ (設置環境變量 environment variable)
      此標記使環境變量VAR的值爲VAL,VAL能夠包含可擴展的反向引用的正則表達式$N和%N。 此標記能夠屢次使用以設置多個變量。 這些變量能夠在其後許多狀況下被間接引用,但一般是在XSSI (via <!–#echo var=」VAR」–>) or CGI(如$ENV{‘VAR’})中, 也能夠在後繼的RewriteCond指令的pattern中經過%{ENV:VAR}做引用。使用它能夠從URL中剝離並記住一些信息。

    • ‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’ (設置cookie)
      它在客戶端瀏覽器上設置一個cookie。cookie的名稱是NAME,其值是VAL。domain字段是該cookie的域,好比’.apache.org’,可選的lifetime是cookie生命期的分鐘數,可選的path是cookie的路徑。

其實apache手冊中有: http://man.chinaunix.net/newsoft/ApacheManual/mod/mod_rewrite.html

apache的官方rewrite guide 舉例,如下是wordpress的rewrite的.htaccess:

# BEGIN WordPress
RewriteEngine On
RewriteBase /
#把learndiary.com的網址所有重定向到www.learndiary.com下
RewriteCond %{HTTP_HOST} ^learndiary.com [NC]
RewriteRule ^(.*)$ http://www.learndiary.com/$1 [L,R=301]
#除開*.do形式的URL(必須)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !.+.do
RewriteRule . /index.php [L]

Apache死循環

規則:

RewriteRule ^(.*) /111/$1 [R,L]

使用curl測試,沒有問題,可是使用瀏覽器訪問時,出現了無限循環。原本訪問的是 www.111.com 結果變成了 www.111.com/111/111/111/..... 雖然在最後加了 [L] 依然無論用,可能apache仍是不夠智能,一直知足條件就一直去匹配,一直去跳轉。最後沒招了只能再加一個條件。

RewriteCond   %{REQUEST_URI} !^/111
RewriteRule ^(.*) /111/$1 [R,L]

這樣就再也不循環了。

rewritecond的另外一種方式

RewriteCond   $1 !^/111
RewriteRule ^(.*) /111/$1 [R,L]

對於 !^所匹配的對象,咱們還能夠寫成多個一塊兒的形式:

RewriteCond %{REQUEST_URI} !^(/111|/222|/333|index.php)

php.ini 中開啓短標籤

控制參數: short_open_tag = On
若是設置爲Off,則不能正常解析相似於這樣形式的php文件:

<?
phpinfo()
?>

而只能解析:

<?php
phpinfo()
?>

這樣形式的php文件。 因此要想php支持短標籤,須要咱們把short_open_tag 設置爲On。

相關文章
相關標籤/搜索