【问题标题】:Tell from where a .php file has been included?告诉从哪里包含 .php 文件?
【发布时间】:2010-12-13 21:25:13
【问题描述】:

是否有人知道一种自动方式来判断 PHP 脚本是直接调用(作为 HTML 页面),还是作为 JavaScript,还是作为 CSS 样式表?

没有 GET 变量,或者在文件中设置一个标志(这就是我现在正在做的)。

只是好奇。

编辑: 一些背景,因为它被要求在答案中:我想要这个的原因是我在提供 HTML 页面以及提供 CSS 文件时使用的框架。这个框架有一个自定义的错误处理程序。当我处于 JS“模式”时,我想将错误作为 JS alert() 抛出。当我处于 CSS 模式时,可能是红色的身体背景或其他东西。为了代码整洁,我想避免使用标志 (?mode=css) 或常量定义,但一些回答者已经确认,没有“神奇”的方法可以找出资源的用途。

【问题讨论】:

    标签: php javascript css include header


    【解决方案1】:

    所以你要区分:

    <link type="text/css" rel="stylesheet"
      href="http://example.com/path/to/php-file.php" />
    
    <script type="text/javascript"
      src="http://example.com/path/to/php-file.php"></script>
    

    或者干脆打开 http://example.com/path/to/php-file.php 在浏览器中。

    在这些情况下没有设置标志来区分如何文件被调用。您可以通过执行&lt;?php print_r($_SERVER); ?&gt; 来检查$_SERVER 数组,它们在每种情况下都应该相同。

    我认为您将 ?mode=css?mode=js 添加到 url 的末尾 - 这似乎是切换您想要的输出类型的合乎逻辑的方式。然后在代码中你可以这样做:

      $mode = (isset($_GET['mode']) ? $_GET['mode'] : '';
      switch ($mode):
        case 'css':
          // css
        break;
        case 'js':
          // js
        break;
        default:
          // default
      endswitch;
    

    【讨论】:

    • 干杯,但这就是我现在正在做的“设置标志”(也许我不够清楚,抱歉)。我正在寻找一种自动、可靠的方法来整理代码。
    • 抱歉,正如 Piskvor 在他们的回答中所说,来自浏览器的每个请求都只是一个 GET 请求。没有提供魔法上下文。 HTTP 请求是无状态的,我认为 为什么 PHP 无法读取上下文。更多关于无国籍的信息:yafla.com/dennisforbes/…
    • 谢谢,这就是我想要确认的(或有矛盾的)。
    【解决方案2】:

    如果我理解正确,你有一个页面会调用自己,(像这样):

    <?php // page.php
    if (is_called_as_js()) {
        header('Content-Type: text/javascript;charset=utf-8');
        echo "alert('hello');";
        exit;
    } elseif (is_called_as_css()) {
        header('Content-Type: text/css');
        echo 'body { color: green }';
        exit;
    }
    ?>
    <html>
    (...)
    <script src="page.php"></script>
    <link rel="stylesheet" href="page.php" />
    

    在这种情况下,不,没有办法告诉 - 浏览器发送一个请求说GET /page.php。没有提及意图 - 只是“给我页面,浏览器将决定如何处理它”。 (是的,是的,有Accept 之类的,还没有看到现代浏览器实际使用此功能说“给我这个页面作为CSS”,大多数只是说Accept: */*

    如果你坚持所有的输出,无论是 JS、CSS 还是 HTML,都应该用一个文件生成,我建议使用 URL 重写器(假设 Apache HTTP 服务器,这将是 mod_rewrite;大多数平台以某种方式提供此功能)。使用 mod_rewrite 的示例:

    # .htaccess
    RewriteEngine On
    RewriteRule ^css/(.*) /page.php?type=css&file=$1 [L]
    RewriteRule ^js/(.*) /page.php?type=js&file=$1 [L]
    

    这样,当您的脚本运行时,对/css/style.css 的请求将看起来像page.php?type=css&amp;file=style.css,对于/js/foobar.js 也是如此。

    (从技术上讲,您仍在使用 GET 变量来确定结果是否应该是 HTML、JS 或 CSS;但它对用户不可见,而且您绕过了一些旧浏览器的限制“如果查询字符串,不要缓存或缓存不完整")

    【讨论】:

    • 我正在开发的产品也必须能够在其他平台上运行,所以 mod_rewrite 不是一个选项。还是个好主意。 +1
    • 大多数平台都包含某种形式的 URL 重写,我使用过我熟悉的 mod_rewrite。
    • 是的,但许多(大多数)共享主机提供商出于性能原因将其关闭。
    • @Pekka 我不知道大多数共享托管服务提供商禁用 url 重写。我没有数据,但我能想到的所有共享托管服务提供商都是 LAMP,包括 .htaccess 功能,以及进行 mod_rewrite 调用的能力。想一想:wordpress、drupal 和其他需要漂亮网址的标准 CMS。
    • @artlung:大多数人不这样做,但仍然有很多人这样做;我会默认使用漂亮的 URL,并在配置中提供一个选项以使用您的(artlung 的)解决方案。
    【解决方案3】:

    没有。

    尽管如此,您确实没有任何理由需要这样做。您应该有非常不同的 php 文件被称为 css 或 js 文件,或者您应该传递 get 参数。他们布局代码的方式应该明确。

    【讨论】:

      【解决方案4】:

      虽然我并不完全清楚为什么要通过单个脚本生成如此不同的文件类型,但您可以使用不同的包装器:

       <?php // js.php
       define('TYPE','javascript');
       require('page.php');
       ?>
      
      
       <?php // css.php
       define('TYPE','css');
       require('page.php');
       ?>
      
      
       <?php // page.php
       if (!defined('TYPE')) {
          ?>
          <script src="js.php"></script>
          <link rel="stylesheet" href="css.php" />
          <?php
       } else if (TYPE == 'javascript') {
          header('Content-Type: text/javascript;charset=utf-8');
          ?>
          alert('hello');
          <?php
       } else if (TYPE == 'css') {
          header('Content-Type: text/css');
          ?>
          BODY { color: red }
          <?php
       }
       ?>
      

      你最终还是要访问 page.php,但你现在知道它的意图了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多