2009-05-22 70 views
0

我已經繼承了大量嚴格編碼的PHP文件,其輸出需要以編程方式進行修改。PHP include()受mod_rewrite影響

要做到這一點,我選擇了通過其他PHP文件來運行它們,rewriter.php,看起來大約是這樣的:

<?php 
if(!preg_match('/^([a-zA-Z0-9\-_]*)$/', $_GET['page'])) 
    die('Incorrect page supplied.'); 
ob_start('changeOutput'); 

include($_GET['page'].'.php'); 
ob_end_flush(); 

function changeOutput ($buffer) { 
    ... 
} 
?> 

我使用mod_rewrite,迫使他們通過這個文件運行:

RewriteEngine On 
RewriteRule ^([^\.]*)\.php$ rewriter.php?page=$1 

但是顯示的錯誤消息讓我相信include()語句受到上面RewriteRule的影響,也就是說它試圖通過rewriter.php等運行rewriter.php。

我想有很多方法可以解決這個問題,但我特別想找一種方法來避免include()語句受到mod_rewrite的影響。我瀏覽了模塊文檔,但找不到任何相關的內容。

當然,這種方法的替代方案也是受歡迎的。

謝謝你的時間和想法。

最好的問候,
丹尼爾

+0

極不可能。又有什麼錯誤信息? – Gleb 2009-05-22 18:18:11

+0

您確定您的腳本正在從您期望的目錄運行嗎?這可能看起來像被重定向。 – Dave 2009-05-22 18:27:17

+0

你正在從每個目錄conf文件(.htaccess)文件或主apache conf文件(httpd.conf文件)的上下文中運行這些重寫規則。conf)文件? – 2009-05-22 20:25:49

回答

2

的聽起來你正在尋找的RewriteCond,這本質上是mod_rewrite的

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !rewriter.php$ 
RewriteRule ^([^\.]*)\.php$ rewriter.php?page=$1 [L] 

這將防止您的規則被應用到URL的條件語句結束rewriter.php。

-1

包括使用你它指的是文件系統的方式,繞過國防部重寫翻譯引擎。

我會看你的正則表達式。

/^([a-zA-Z0-9\-_]*)$/ 

匹配空字符串也。

嘗試

/^([a-zA-Z0-9\-_]+)$/ 

,看看是否$ _GET [ '頁']爲空。

1

你應該首先檢查文件是否包括之前存在:

if ($_GET['page'] != 'rewriter' && is_file($_GET['page'].'.php')) { 
    include $_GET['page'].'.php'; 
} else { 
    // file does not exist or is invalid 
} 
+0

這會工作,但會爲網站的每個請求添加一個額外的文件統計信息。在低流量網站上可能不是什麼大問題,但通過在Apache級別處理很容易避免。 – 2009-05-22 21:54:14

0

您可以添加條件到您的htaccess這將檢查文件是否存在一個的RewriteCond。類似於Gumbo的評論,除了稍快(並且更輕量級的代碼方式)。

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} -f 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^([^\.]*)\.php$ rewriter.php?page=$1 

這將檢查它是否是相對於您的網站根目錄的文件或目錄。如果是,它會運行重寫器。快速觸摸的.htaccess迷死:)