2017-02-23 88 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"; 
?>