2017-02-23 63 views
0

我花了好幾個小時試圖弄清楚如何進行重寫,將請求的頁面連同任何查詢字符串一起提供並把它們送入一個php腳本進行處理。這與編寫一個寧靜的API有關,go.php腳本將根據請求的頁面和通過查詢字符串傳遞給它的任何參數決定要做什麼。一個難點是編碼?和=在查詢字符串中,但這些可以替換爲任何內容。Apache mod重寫page.ext?qstring go.php?parms =「page.ext?qstring」

customer.json?action=add,id=123,name=smith 

映射到

go.php?parms=customer.json?action=add,id=123,name=smith 

其中 「customer.json?action=add,id=123,name=smith」 被視爲一個字符串,即=,?不要把東西扔掉。如果需要替代字符可以替代這些。

回答

0

我已經找到了我自己的問題的答案。該.htaccess文件中包含go.php腳本的目錄必須

<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{QUERY_STRING} ^$ [OR] 
RewriteCond %{QUERY_STRING} ^(.*)$ [NC] 
RewriteRule ^(.*)$ go.php?page=$1;%1 [NC,L] 
</IfModule> 

這將映射如下。假設go.php腳本位於example.com/api目錄中。

  1. 第一個和第二RewriteCond語句返回實際存在的API目錄中的任何文件或目錄 。
  2. 第3個和第4個RewriteCond語句將URL 中的任何查詢字符串捕獲到名爲%1的變量中。第三條語句處理no查詢 字符串大小寫。
  3. 最後一條RewriteRule語句將URL中的api目錄 下的資源名稱捕獲到名爲$1的變量中。然後它調用go.php腳本,並傳入新的查詢字符串,其中包含 資源名稱,後跟;後跟原始查詢字符串。

一些例子

  1. 如果「junk.html exists in/api`它會被退回。
  2. 如果'sub/junk.html exists in/api`將被返回。
  3. 如果customer.json/api存在,那麼 customer.json?id=123,name=smith將調用go.php,並通過它叫做page與價值customer.json;id=123,name=smith單個查詢字符串變量。

所有這一切背後的想法是在RESTful API中使用它。在上面的第三個示例中,customer是資源,json是表示,其餘是參數。 go.php腳本可以使用此數據在資源上執行HTTP動詞並返回請求的表示。

我爲什麼要這樣做。通常在數據庫應用程序中,資源有很多參數,因此如果我們使用嵌套的/傳遞所有這些參數,那麼創建和更新資源看起來有點麻煩,這正是我所瞭解的純RESTful API所需的參數。

要測試上述Rewrite這裏的代碼是一個簡單的go.php腳本。

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="UTF-8"> 
<title>Go Baby</title> 
</head> 
<body> 
<?php 
$page = "NIX"; 
if(isset($_GET["page"])) 
    $page = $_GET["page"]; 
echo "Passed in page $page"; 
?>