Posts tagged PHP

URL重寫舉例

1. 給子域名加www標記

RewriteCond %{HTTP_HOST} ^([a-z.]+)?example\.com$ [NC]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .? http://www.%1example.com%{REQUEST_URI} [R=301,L]

這個規則抓取二級域名的%1變量,如果不是以www開始,那么就加www,以前的域名以及{REQUEST_URI}會跟在其后。

2. 去掉域名中的www標記

RewriteCond %{HTTP_HOST} !^example\.com$ [NC]
RewriteRule .? http://example.com%{REQUEST_URI} [R=301,L]

More >

RewriteRule指令

RewriteRule Pattern Substitution [Flags]
在模式(Pattern)和替換(Substitution)中使用正則表達式來匹配相應的字符。
譬如有如下的URL:

http://www.example.com/display.php?country=USA&state=California&city=San_Diego

REQUEST_URI的值是“/country=USA &state=California&city=San_Diego”,要將國家州城市信息更友好的顯示給用,要顯示成這樣:

http://www.example.com/USA/California/San_Diego

More >

開啟mod_rewrite模塊

使用URL重寫功能,需要安裝mod_rewrite模塊。使用phpinfo()函數,找到Apache Modules section部分,可以看到當前apache加載模塊。
如果沒有開啟mod_rewrite, 就需要配置mod_rewrite.so的路徑:
LoadModule rewrite_module modules/mod_rewrite.so
Apache2內置了mod_rewirte,在配置虛擬主機的配置文件VirtualHost部分打開引擎:RewriteEngine on
這句之后就可以使用重寫語法了。
VirtualHost文件部分的Directory配置必須是:

Options Includes FollowSymLinks #允許使用符號鏈接
AllowOverride All #允許目錄配置文件.htaccess。如果不使用是AllowOverride None

利用mod_rewrite重寫URL主要使用兩個基本的指令RewriteRule和RewriteCond。

URL Rewrite mod_rewrite Notes

Rewirte主要的功能就是實現URL的跳轉,它的正則表達式是基于Perl 語言。可基于服務器級的(httpd.conf)和目錄級的 (.htaccess)兩種方式。如果要想用到rewrite模塊,必須先安裝或加載rewrite模塊。方法有兩種一種是編譯apache的時候就直接安裝rewrite模塊,別一種是編譯apache時以DSO模式安裝apache,然后再利用源碼和apxs來安裝rewrite模塊。

基于服務器級的(httpd.conf)有兩種方法,一種是在httpd.conf的全局下直接利用RewriteEngine on來打開rewrite功能;另一種是在局部里利用RewriteEngine on來打開rewrite功能,下面將會舉例說明,需要注意的是,必須在每個virtualhost里用RewriteEngine on來打開rewrite功能。否則virtualhost里沒有RewriteEngine on它里面的規則也不會生效。

基于目錄級的(.htaccess),要注意一點那就是必須打開此目錄的FollowSymLinks屬性且在.htaccess里要聲明 RewriteEngine on。
More >

URL Rewriting – Apache Module Rewrite

apache 設定檔
apache預設已有mod_rewire 模組: (httpd.conf 相關設定)
預設也已啟用.
LoadModule rewrite_module libexec/apache/mod_rewrite.so
AddModule mod_rewrite.c
More >

PHP ob_start() 介紹

用PHP的ob_start();控制您的瀏覽器cache!

Output Control 函數可以讓你自由控制腳本中數據的輸出。它非常地有用,特別是對于:當你想在數據已經輸出后,再輸出文件頭的情況。輸出控制函數不對使用 header() 或 setcookie(), 發送的文件頭信息產生影響,只對那些類似于 echo() 和 PHP 代碼的數據塊有作用。

我們先舉一個簡單的例子,讓大家對Output Control有一個大致的印象:
Example 1.

<?php
ob_start(); //打開緩沖區
echo \"Hellon\"; //輸出
header("location:index.php"); //把瀏覽器重定向到index.php
ob_end_flush();//輸出全部內容到瀏覽器
?>

所有對 header()函數有了解的人都知道,這個函數會發送一段文件頭給瀏覽器,但是如果在使用這個函數之前已經有了任何輸出(包括空輸出,比如空格,回車和換行)就會提示出錯。如果我們去掉第一行的ob_start(),再執行此程序,我們會發現得到了一條錯誤提示:"Header had all ready send by"!但是加上ob_start,就不會提示出錯,原因是當打開了緩沖區,echo后面的字符不會輸出到瀏覽器,而是保留在服務器,直到你使用 flush或者ob_end_flush才會輸出,所以并不會有任何文件頭輸出的錯誤!

More >