【问题标题】:using includes cross domain that contain php code - failing使用包含包含 php 代码的跨域 - 失败
【发布时间】:2013-12-08 01:25:06
【问题描述】:

我有一系列网站都托管在具有不同域的同一台服务器上。我想托管一些常见的 PHP 脚本,然后能够从其他域调用这些脚本。

我对我的 php 有点新鲜,所以请原谅代码尝试 - 我已经尝试过以下迭代,这可能会帮助您理解我的目标!

从 php 标签内 ...

include('http://www.mydomain/common_include.php?show_section=$section');

$show_section = $_GET['show_section'];
include('http://www.mydomain/common_include.php');//Then $show_section would be available to the included file/cod

最后我尝试拉入包含一个函数的包含,然后尝试从父脚本运行该包含。

  • 我更愿意保留这个 PHP 导向而不是得到 与服务器有关(文件 系统等(但我可以改变 权限等)
  • 我可以但不希望只将同一个库分别上传到每个域
  • 我知道 PHP 在服务器上运行,因此将脚本包含到另一台服务器上可能会出现问题。

提前致谢。

#

编辑 好的好的-我知道这是不好的做法,所以不会这样做....非常感谢您的快速回答。 但是,对于如何在所有站点上基本显示这个基本的 php 应用程序而不必将文件添加到每个站点的根目录,还有其他建议吗?只是为了防止大量脚本重复......(大声思考从数据库或任何其他解决方案中调用脚本) 再次感谢您的帮助

【问题讨论】:

  • 代码需要在服务于所有站点的服务器上。仅此而已。

标签: php include cross-domain common-files


【解决方案1】:

如果您只能将远程 PHP 文件包含到您自己的项目中,那将是一个巨大的安全风险。 PHP 在服务器将其发送给您之前被解析,因此跨域包含将仅包含脚本生成的输出。包含 PHP 文件以便执行它们的唯一方法是通过本地文件系统。

如果你查看 PHP.net 关于包含的文档,你会发现:

如果在 PHP 中启用了“URL fopen 包装器”(它们在默认配置中),您可以使用 URL 指定要包含的文件(通过 HTTP 或其他支持的包装器 - 请参阅支持的协议/包装器列表协议列表)而不是本地路径名。如果目标服务器将目标文件解释为 PHP 代码,则可以使用与 HTTP GET 一起使用的 URL 请求字符串将变量传递给包含的文件。严格来说,这与包含文件并使其继承父文件的变量范围不同。该脚本实际上正在远程服务器上运行,然后将结果包含到本地脚本中。

这几乎解释了整个事情。

【讨论】:

    【解决方案2】:

    最初问题的根源似乎是发帖者担心在多个站点上使用 PHP 脚本或插件,然后每次需要更新时都会执行繁重的任务。虽然尝试跨站点包含 PHP 文件是一个坏主意,但最好的计划是构建尽可能自包含的脚本。将整个插件包含在一个目录中......并确保使用它的函数调用格式尽可能 - 干净,命名良好的函数,统一的命名约定以及每个函数需要哪些参数的深思熟虑的计划。避免使用全局变量。

    理想情况下,您每次需要在所有位置更新插件/脚本时都应该很轻松。您甚至可以设置一个自动化过程,将包含插件的新目录上传到每个站点,替换旧目录。而且代码中的函数调用应该很少改变。

    如果您的脚本足够大,您可能会实现自动更新过程,例如使用最新版本的 Wordpress。单击一个按钮,它会自行更新。过去,更新十几个运行 Wordpress 的网站(例如)非常痛苦。

    【讨论】:

    • 在每个站点的本地副本中......只需从某种源代码控制系统中提取代码。然后,您将这些脚本仅放在一个主位置,并且可以进行更新,然后将这些更新拉到使用它的所有站点。
    【解决方案3】:

    这是非常糟糕的做法。
    实际上,您包含的不是 PHP,而是 HTML 代码。

    包括文件,而不是网址。同一台服务器是可能的。
    只需使用这些文件的绝对路径

    【讨论】:

    • 抱歉,您能否澄清一下“包含文件,而不是 url”,您的意思是使用 php 'file_get_content's 还是 'fopen'?谢谢
    • @user256888 我的意思是使用相同的包含。但使用 filename 作为参数,而不是 URL。
    • 包含文件意味着包含('/usr/local/apache/htdocs/common_include.php') 不包含('mydomain/common_include.php')
    【解决方案4】:

    除了这是一种不好的做法之外,如果您真的想这样做,您应该首先检查 include 是否允许 URLs

    但是,如果所有站点都需要使用该脚本,您可以将脚本放在执行 php 的用户可访问的目录中,并将该目录添加到 php.ini include_path 属性 (can also be done at runtime)

    (或者您可以创建一个 php 扩展并将其加载为扩展)

    【讨论】:

      【解决方案5】:

      如果您在该服务器上拥有 root 权限,则可以只使用来自文件系统根目录的绝对路径,但大多数主机不允许您这样做。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-12
        • 1970-01-01
        • 1970-01-01
        • 2011-12-22
        • 1970-01-01
        • 2011-11-04
        • 1970-01-01
        • 2011-05-22
        相关资源
        最近更新 更多