我有一些 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。我愿意使用轻量级的第三方解决方案。