[英]What is the correct way to set up apache RewriteMap to pull from a Database? (PHP/APACHE/MYSQL)
[英]How Do I Use Apache RewriteMap with PHP?
我一直在研究使用RewriteMap來動態處理一系列 URL 重寫,我想做的是使用 PHP 腳本來生成適當的重寫條件和規則——但我無法讓它工作。
我已經在帶有 WebHost Manager 和 cPanel 的 Linux 服務器上運行了 Apache。
我將以下內容添加到 WHM > Apache Configuration > Include Editor > PreVirtual Host Include > All Versions:
RewriteMap myrules "prg:/usr/lib/php /path/to/my/script.php"
我更新了配置文件,Apache 重新啟動正常。
現在我想調用我從 .htaccess 文件定義的 RewriteMap 來執行重寫,但這就是我被卡住的地方,一切似乎都壞了。
我想獲取傳入域,根據地圖檢查它,然后返回關聯的域:user_name 值。 就像是:
RewriteCond %{HTTP_HOST} ^(www\.)?${myrules:%{HTTP_HOST}}\.com$ [NC]
RewriteRule ^(.*)$ http://mywebsite.com/user/${myrules:%{HTTP_HOST}}/$1 [NC,P,L]
因此,舉例來說,如果我的地圖有 johnsmith.com:john-smith,那么傳入的 URL johnsmith.com 將代理 mywebsite.com/user/john-smith/ 上的內容。
首先,我很確定上面的條件/規則都是錯誤的。
正確處理是我的首要任務。
其次,如何使用由 RewriteMap 定義的 PHP 腳本輸出我的地圖?
任何幫助,將不勝感激!
johnsmith.com 是否首先解析到您的服務器? 如果 johnsmith.com 和 mywebsite.com 由同一服務器處理,則不需要代理請求。
我認為你的規則應該更像這樣:
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+\.com)$ [NC]
RewriteRule ^.*$ http://mywebsite.com/user/${myrules:%1}/$0 [NC,P,L]
# or
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+\.com)$ [NC]
RewriteRule ^ - [E=MAPTO:${myrules:%1}]
RewriteCond %{ENV:MAPTO} !=""
RewriteRule ^.*$ http://mywebsite.com/user/%{ENV:MAPTO}/$0 [NC,P,L]
筆記:
$0
是與 RewriteRule 的模式匹配的整個字符串(如果 .htaccess 在您的 DocumentRoot 中,則$0
和%{REQUEST_URI}
是相同的)%1
是與最后一個 RewriteCond 的第一個捕獲括號匹配的字符串(因此,沒有潛在前綴“www.”的 Host 標頭的值。)在第二組規則中,第一條規則將“RewriteMap 調用”的結果放在名為 MAPTO 的環境變量中。 第二個,旨在忽略未知/未映射的主機(MAPTO 值為空字符串)。
以及作為 RewriteMap 的說明性 PHP 代碼:
<?php
$map = [
'foo.com' => 'bar',
'johnsmith.com' => 'john-smith',
];
if (!defined('STDOUT'))
define('STDOUT', fopen('php://stdout', 'w'));
if (!defined('STDIN'))
define('STDIN', fopen('php://stdin', 'r'));
set_file_buffer(STDOUT, 0);
while (!feof(STDIN)) {
$input = rtrim(fgets(STDIN), "\n");
fputs(STDOUT, (array_key_exists($input, $map) ? $map[$input] : 'NULL') . "\n");
}
注意: 'NULL'
值是 Apache 期望知道一個值何時未映射到另一個值的字符串。 它允許您在 Apache 級別定義自己的默認值。 例如:要將“root”作為后備,請使用以下語法: ${myrules:%1|root}
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.