【问题标题】:Can I make a catchall php script with htaccess?我可以用 htaccess 制作一个包罗万象的 php 脚本吗?
【发布时间】:2011-05-03 23:52:27
【问题描述】:

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

为什么?例如,这将允许我将压缩版本的 javascript 文件发送到浏览器。

如何做到最好,利弊是什么?

【问题讨论】:

  • url rewriting index.php 的可能重复项 - 使用 mod_rewrite
  • 所以即使文件存在,你希望重定向发生吗?
  • 是的。根据对 script.js 的要求;如果 script.js 和 script.min.js 存在,它将发送 script.min.js。如果“min.js”不存在,它将发送 script.js(或者它可能创建“.min.js”并发送)

标签: php .htaccess


【解决方案1】:

将所有数据路由到单个 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 参数都被前端解析器更改。

【讨论】:

    【解决方案2】:

    回答不重复的部分:

    通过单个资源路由所有访问称为FrontController。这是一种常见的模式,但它应该处理对应用程序的请求,而不是网络服务器上的任何资源

    将所有(实际上是所有)请求传递给 index.php 完全是资源浪费。您的 index.php 必须确定在每个请求上提供什么服务,从而有效地使其成为网络服务器。这不是它应该做的,也不是它擅长的。

    另外,我假设您希望在每次请求时都缩小您的 JS 文件。如果您可以这样做一次,然后为每个请求提供缩小版本,充分利用网络服务器的缓存和压缩,而不是从 PHP 脚本重新实现,为什么要这样做?

    【讨论】:

    • 它不会创建缩小版本。如果存在,它将发送最小版本,如果不存在,它将发送原始版本。
    • @bkilinc 这仍然不是通过 PHP 提供服务的好理由。您可以在部署期间处理缩小,或者只是在模板中包含一个条件。
    【解决方案3】:

    【讨论】:

      猜你喜欢
      • 2014-08-11
      • 1970-01-01
      • 2011-07-23
      • 2023-01-19
      • 1970-01-01
      • 1970-01-01
      • 2018-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多