将所有数据路由到单个 PHP 文件以确定如何解析它可以让您更好地控制数据的提供方式,但它也会损害您的性能。
方法是将以下内容放入您的 .htaccess 文件中:
RewriteEngine On
RewriteBase /
RewriteRule (.*) parse-request.php
这会将请求直接发送到 parse-request.php。更重要的是,由于请求不是作为 GET 变量(例如parse-request.php?request=my/webapp/index.php)传递的,因此欺骗您的服务器有点困难,人们也更难意识到甚至还有前端解析请求。
parse-request.php 应该包含如下内容:
<?php
$url = parse_url($_SERVER["REQUEST_URI"]);
$extension = substr($url["path"], strrchr($url["path"], '.')+1);
switch($extension){
case "zip": $ctype = "application/zip"; break;
case "jpeg":
case "jpg": $ctype = "image/jpg"; break;
case "php":
case "html": $ctype = "text/html"; break;
case "css": $ctype = "text/css"; break;
case "js": $ctype = "text/javascript"; break;
}
header("Content-type: ".$ctype);
/*
Now determine how to display each one
*/
if($extension == "js"){
// minify and output
} else if ($extension == "php"){
require($url["path"]); // run the PHP file
// Note that certain variables in PHP believe you are in the subdirectory of parse-request.php
// You have to account for this in your webapp
} else...
...
...
}
?>
这是基本的想法。当然,您可以无限扩展,例如“如果用户已登录,则提供图像。如果没有,则提供'注册以查看此图像'图像”。尽管如前所述,这会导致大量开销,并且会减慢您的网站速度。更好的方法是使用多种方法来解析您实际想要更改的任何信息,而不是使用单一方法来解析所有内容。例如,使用您的 .htaccess 文件:
RewriteEngine On
RewriteBase /
RewriteRule (.*).js minify-js.php
RewriteRule (.*).css parse-css.php
RewriteRule secretimages/(.*).jpg hide-images.php
RewriteRule profile.html are-you-logged-in.php
通过在不同的脚本之间拆分工作,您只运行必要的部分,从而大大减少了开销。此外,这样任何不在“secretimages”文件夹中的图像都可以直接由 Apache 提供,而无需加载 PHP 解析器。无论如何,与您刚刚通过的任何内容相同。
不过,最重要的是,只需选择特定项目以进行不同的解析,您就不必重新编码任何网络应用程序。我向您保证,MediaWiki 或其他东西会不喜欢他们的所有 URI 参数都被前端解析器更改。