2012-05-25 168 views
0

我想使用輸出緩衝區在PHP中重寫我的URL。理想情況下,這是我的來源,我可以保留我的鏈接作爲example.com/index.php?action=123;sa=456;sa2=789,但當輸出到瀏覽器它重寫爲example.com/123/456/789它似乎工作,但當它到達「sa2」重寫輸出緩衝區往往偶爾會中斷,所有的瀏覽器看到的是一個空白的白頁。當頁面加載時,它會啓動一個帶有gzip的輸出緩衝區,然後是一個帶有重寫回調的輸出緩衝區。這裏是我的PHP /的.htaccess從輸出緩衝區PHP URL重寫

<?php 

if (!ob_start("ob_gzhandler")) 
    ob_start(); 

// Handle Rewriting of URLs 
RewriteURLs(); 

function RewriteURLs() 
{ 
// rewrite URLS from output buffer 
function rewrite($buffer) 
{ 
    // pages 
    $buffer = preg_replace('/index.php\?page=(.*?)/is', "page/$1", $buffer); 
    // sub-sub-actions 
    $buffer = preg_replace('/index.php\?action=(.*?);sa=(.*?);sa2=(.*?)/is', "$1/$2/$3", $buffer); 
    // sub-actions 
    $buffer = preg_replace('/index.php\?action=(.*?);sa=(.*?)/is', "$1/$2", $buffer); 
    // actions 
    $buffer = preg_replace('/index.php\?action=(.*?)/is', "$1", $buffer); 
    // index.php removal 
    $buffer = preg_replace('/index.php/is', "", $buffer); 
    return $buffer; 
} 
// start for rewriting 
ob_start('rewrite'); 
} 

// rest of content/page loading....... 
?> 

的.htaccess辦理重寫

Options +FollowSymLinks 
RewriteEngine on 
RewriteBase /
# Rules for: pages 
RewriteRule ^page/([-_!~*'()$\w]+)/?$ index.php?page=$1 [L,QSA] 

# Rules for sub-sub-actions 
# /{action}/{subaction}/{subsubaction}/ 
RewriteRule ^([-_!~*'()$\w]+)/([-_!~*'()$\w]+)/([-_!~*'()$\w]+)/?$ index.php?action=$1;sa=$2;sa2=$3 

# Rules for sub-actions 
# /{action}/{subaction}/ 
RewriteRule ^([-_!~*'()$\w]+)/([-_!~*'()$\w]+)/?$ index.php?action=$1;sa=$2 

# Rules for: actions 
# /{action}/ 
RewriteRule ^([-_!~*'()$\w]+)/?$ index.php?action=$1 [L,QSA] 

這看起來越來越像一個PHP輸出緩衝的問題,我似乎無法找到什麼,我做錯了。任何幫助是極大的讚賞。

回答

1

請注意這段代碼,因爲基於php版本,您使用發送到重寫函數的緩衝區字符串只能包含整個緩衝區的大塊(破壞正則表達式邏輯)。您必須強制chuck_size可選參數爲零(在PHP 5.4版,並降低默認的卡盤大小爲4096個字節)

看看關於ob_start文檔:

http://es.php.net/manual/en/function.ob-start.php

這可能是原因爲什麼此代碼「偶爾中斷」

+0

強制塊大小似乎沒有解決問題。 'ob_start('rewrite',0);'當訪問帶有「sa2」的鏈接時仍然產生空白頁面 –