1

我有一些 URL 想通过 PHP 映射到某些文件。目前,我只是在 Apache 中使用 mod_rewrite。但是,我的应用程序变得太大,无法使用正则表达式进行重写。所以我创建了一个router.php进行重写的文件。我知道要进行重定向,我可以发送Location:标头。但是,我并不总是想做重定向。例如,我可能想/api/item/映射到/herp/derp.php相对于文档根目录的文件。我还需要保留 HTTP 方法。“没问题,”我想。我做.htaccess了以下片段。

RewriteEngine On
RewriteRule ^api/item/$ /cgi-bin/router.php [L]

我的router.php文件如下所示:

<?php

$uri = parse_url($_SERVER['REQUEST_URI']);
$query = isset($uri['query']) ? $uri['query'] ? array();
// some code that modifies the query
require_once "{$_SERVER['DOCUMENT_ROOT']}/herp/derp.php?" . http_build_query($query);

?>

但是,这不起作用,因为操作系统正在寻找一个名为derp.php?some=query. 如何模拟RewriteRule ^api/item/$ /herp/derp/ [L]PHP 中的重写规则。换句话说,我如何告诉服务器处理与请求不同的 URL 并保留查询和 HTTP 方法而不导致重定向?

注意:使用设置的变量router.php不太理想,而且结构不好,因为它只应该负责处理 URL。我愿意使用轻量级的第三方解决方案。

4

2 回答 2

1

更改您的 .htaccess 以读取

RewriteEngine On
RewriteRule ^api/item/$ /cgi-bin/router.php [QSA,L]

在你的 php

// update your get variables
$_GET['some_var'] = 'my modifications';

// require file
require_once "{$_SERVER['DOCUMENT_ROOT']}/herp/derp.php"
于 2013-10-23T15:27:27.523 回答
0

而不是require_once,尝试file_get_contents

file_get_contents ((stripos($_SERVER['SERVER_PROTOCOL'],'https') === true ? 'https://' : 'http://'). "{$_SERVER['SERVER_NAME']}/herp/derp.php?" . http_build_query($query));

小心SERVER_NAME

编辑

作为记录,如果您需要使用任何方法(HTTP、HTTPS、FTP 等)或页面信息(如 cookie),您可以使用作为 cURL 和 PECL 的内置(更快?)替代方案。在这个例子中:

$params = array(
   'http' => array(
      'method' => 'GET',
      'content' => http_build_query($query)
   )
);

$context = stream_context_create($params);

file_get_contents (
   (stripos($_SERVER['SERVER_PROTOCOL'],'https') === true ? 'https://' : 'http://'). "{$_SERVER['SERVER_NAME']}/herp/derp.php", 
   false, 
   $context
);
于 2013-10-23T15:47:36.193 回答