【问题标题】:PHP shared header without using sever-side scripting?不使用服务器端脚本的 PHP 共享标头?
【发布时间】:2010-05-24 17:05:19
【问题描述】:

到目前为止我一直通过 PHP 解决的简单问题:

您有一个包含页眉、菜单、页脚和内容字段的网站。

每个页面的页眉、菜单和页脚通常相同。

  • 在没有 PHP 或任何其他服务器端语言的情况下,如何让页眉、菜单和页脚数据仅存在于一个文件中?

因此,例如,您没有十个页面(如 home.html、products.html、about.html、..)都在其 html 文件中具有静态标题和菜单的副本。现在如果你想改变标题,你必须改变十个文件。

我希望我的问题足够清楚,如果没有,请发表评论:)

【问题讨论】:

  • 似乎答案很好地涵盖了“如何”。我不得不问你为什么要这样做?
  • 看起来你试图用不充分的方法解决典型的任务。当心!
  • @RomanArmy 说真的,您将导航硬编码到您网站的每个页面中?我想这没关系(实际上,不是原则),如果你有一个两页的网站,但我认为共享导航、标题、添加区域、信息 blob 是非常标准的做法(也是好的做法)(欢迎回来 $UserName,自从我们上次说你以来已经过了 $Days...) 等跨站点或站点的部分。否则,您 98% 的维护工作都花在通过 10,000 个页面传播简单更新以更改导航中的链接。
  • +1 表示:为什么会有人认为有必要否决这个问题?
  • 另外,欢迎来到 Stack Overflow cyggi。

标签: php html


【解决方案1】:

如果您使用的是 Apache,则可以使用 server-side includes。这些基本上在 HTML 文档中提供了 include 语句。

安装并启用mod_include。配置

Options +Includes
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml

使用.shtml 作为您的主页文件扩展名。然后在您的页面中,您可以执行以下操作:

<!--#include virtual="/header.html" -->

Nginx 也支持server-side includes 的 SSI 模块:

location / {
    ssi on;
}

HTML:

<!--# include file="header.html" -->

【讨论】:

  • "[...],没有 PHP 或任何其他服务器端语言[...]?"
  • @cyggi,这没有任何服务器端语言。 Apache 本身会解析文件以包含其他文件。
  • @cyggi 这与 PHP 没有任何关系。它内置在 Apache 中。它不需要任何“真正的”服务器端语言,所以我说它非常适合您的使用。
  • “语言”只是 Apache 自己不做的事情?在这方面什么是“真正的语言”? (图灵完备?)
  • 您也可以使用 IIS 执行此操作,或者至少在几年前,在我离开雷德蒙德之前……
【解决方案2】:

框架可以做到这一点。不过结果的质量不能说太多。

【讨论】:

  • 不要尝试。大多数网站不再使用框架是有充分理由的。
  • 另一种方法是使用 iframe,或者使用 JavaScript 的东西将元素插入 DOM,但这些同样令人讨厌。
【解决方案3】:

也可以完全使用客户端脚本来完成。只需执行一些异步请求即可获取静态资源并将它们注入页面。这实际上只是框架的 JS 版本,并不是解决问题的最佳方法,但它会起作用。

【讨论】:

  • 可以在北极圈内裸泳,但这并不意味着这是个好主意 ;)
  • @mattbasta:差不多。公平地说,这个问题问的是如何,大多数人都在他们的答案中包含了一个免责声明,即这是一个坏主意=)。
  • @mattbasta:我也觉得有义务指出,仅仅因为这不是一个好主意通常不会阻止人们这样做youtube.com/watch?v=c1BrcL-ENfI
  • 我听说很多站点只有一个脚本包含在实际的 html 文件中。我不推荐这个,但是我猜它可以工作
【解决方案4】:

如果您的主机支持 shtml 文件,则它们的脚本能力有限。

<!--#include file="included.html" -->

否则,对于纯 html,恐怕你不走运,除非你有一些花哨的 javascript/ajax 来做到这一点。

【讨论】:

  • 现在找到支持 PHP 的主机比 SSI 更容易 1%)
【解决方案5】:

不知道是不是正是你的意思,但你可以用SSI (server-side includes)而不是服务器端脚本来做到这一点。 SSI 不是脚本,它只是一种在不编写任何实际代码的情况下包含其他文件的方式。

至于在完全没有服务器帮助的情况下执行此操作,那就另当别论了。你最好使用服务器来做这种事情。感觉很脏,你最终得到的都是奇怪的文件,而且管理起来很痛苦,但是模板和包含在做你想做的事情方面做得相当不错。

【讨论】:

    【解决方案6】:

    使用 JavaScript 模板,如 UnderscoreClosure 提供的模板。更有可能:拒绝为不愿支付适当的网络托管费用的客户工作,并且仅根据成本而不是适合网站的决定做出决定。

    【讨论】:

      【解决方案7】:

      您拥有的一个选项是将标头包含在引用 JS 文件中,您将 document.write() 包裹在标头周围。当然,我自己的代码不会使用这种方法,因为我通常做 PHP 或 VB。

      【讨论】:

        【解决方案8】:

        我能想到的最明显的方式不涉及服务器语言(但确实涉及服务器端处理)是server side includes

        【讨论】:

          【解决方案9】:

          如果必须,并且没有框架,最好使用 ajax 请求来获取数据。虽然,如前所述,会杀死 seo

          【讨论】:

            【解决方案10】:

            如果您可以使用 javascript 和 jQuery,您可以使用 $.load 动态加载页眉和页脚。虽然不是最干净的解决方案。

            【讨论】:

              【解决方案11】:

              我最喜欢的解决方案是,因为您了解 PHP,所以生成一个 PHP 脚本,给定一个模板文件夹,生成一个包含最终 HTML 文件的文件夹供您上传。实际上,这听起来很容易。

              【讨论】:

                【解决方案12】:

                使用 PHP include 或 Apache 服务器端包含的建议是正确的,这些将解决问题。

                但如果您知道 每个 页面都有相同的页眉和页脚,我建议另一种特定于 PHP 的选项:

                • auto_prepend_file

                • auto_append_file

                请参阅http://www.php.net/manual/en/ini.core.php 的文档

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-03-11
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多