我可以使用htaccess创建一个简单的php脚本吗?

时间:2010-11-02 14:57:03

标签: php .htaccess

我想将所有网址请求指向一个php文件。 这还包括对图像和javascript文件的任何请求,这些请求将被定向到该单个php文件。

为什么?例如,这可以让我将一个javascript文件的压缩版本发送到浏览器。

如何做到最好,哪些可能是利弊?

3 个答案:

答案 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)