我想将所有网址请求指向一个php文件。 这还包括对图像和javascript文件的任何请求,这些请求将被定向到该单个php文件。
为什么?例如,这可以让我将一个javascript文件的压缩版本发送到浏览器。
如何做到最好,哪些可能是利弊?
答案 0 :(得分:3)
将所有数据路由到单个PHP文件以确定如何解析它可以让您更好地控制数据的提供方式,但同时也会损害您的性能。
方法是将以下内容放在.htaccess文件中:
RewriteEngine On
RewriteBase /
RewriteRule (.*) parse-request.php
这会将请求直接发送到parse-request.php。更重要的是,由于请求不是作为GET变量传递的(例如parse-request.php?request=my/webapp/index.php
),因此欺骗服务器有点困难,而且人们更难以意识到甚至还有前端解析请求。 / p>
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或其他东西 NOT 就像前端解析器更改了所有URI参数一样。
答案 1 :(得分:2)
回答不重复的部分:
通过单个资源路由所有访问称为FrontController。这是一种常见模式,但它应该处理对应用程序的请求,而不是 Web服务器上的任何资源。
将所有(如同所有)请求传递给index.php是完全浪费资源。您的index.php必须确定每个请求的服务内容,从而有效地将其作为Web服务器。这不是它应该做的事情,也不是它擅长的。
另外,我假设你想在每次请求时缩小你的JS文件。为什么这样做,你可以做一次,然后在每个请求上提供缩小版本,充分利用网络服务器的缓存和压缩,而不是从PHP脚本重新实现?
答案 2 :(得分:-1)
htaccess RewriteRule http://forums.digitalpoint.com/showthread.php?t=25353