告诉你包含.php文件的位置?

时间:2009-11-06 15:50:40

标签: php javascript css include header

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

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

好奇。

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

4 个答案:

答案 0 :(得分:4)

所以你要区分:

<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   在浏览器中。

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

我认为你将?mode=css?mode=js添加到网址的末尾 - 这似乎是切换所需输出类型的合理方式。然后在代码中你可以做到:

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

答案 1 :(得分:3)

如果我理解正确,你有一个自称的页面,(就像这样):

<?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&file=style.css,类似于/js/foobar.js

(从技术上讲,你仍然使用GET变量来查明结果是否应该是HTML,JS或CSS;但是对于用户来说它是不可见的,如果查询,你可以解决一些旧浏览器的限制“字符串,不要破坏缓存或缓存“)

答案 2 :(得分:1)

没有

但是你真的没有理由要这么做。您应该将非常不同的php文件称为css或js文件,或者您应该传递get参数。他们对你的代码进行布局应该是明确的。

答案 3 :(得分:0)

虽然我不清楚为什么你想通过一个脚本生成这种不同的文件类型,但你可以使用不同的包装器:

 <?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,但现在你知道了什么意图。