簡體   English   中英

如何在 PHP 中使用 Apache RewriteMap?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM