【问题标题】:Best practices with multiple directories in HTMLHTML 中多个目录的最佳实践
【发布时间】:2010-08-02 14:48:19
【问题描述】:

我还没有找到这个问题的明确答案(但已经确定 HTML 标记比它的价值更麻烦。)

当您在网站上处理多个目录时,如何确保在更改当前目录时与网站其余部分的相对链接正常工作?当我转到支持目录时,我不希望我的“/index.php”链接实际链接到“/support/index.php”。

我们使用的是 PHP,所以我可以使用输出缓冲来更改链接,但我想看看其他人是否有什么好主意。也可以通过 Smarty 以一种或另一种方式实现它。我没有从头开始建立一个使用多个目录的网站,仅仅是因为我不知道一个简单的方法来处理这个问题,但问题应该不会太难。

(在 IIS 上运行,但显然让它在任何服务器上运行会更好。)

【问题讨论】:

    标签: php html templates base


    【解决方案1】:

    你可以声明一个 base_url 变量,或者声明一个包含你的基本 url 的常量

    例如

    DEFINE('BASE_URL', 'http://example.com/');
    

    使用链接时

    例如

    <a href="<?php echo BASE_URL; ?>index.php">Home</a>
    

    【讨论】:

    • 这是一个很好的解决方案,像这样设置 URL 被称为使用“绝对路径”。
    • 这就是我最初考虑做的事情,但我认为搜索一种不需要我在每个链接、每个图像等前面放置变量的方法不会有什么坏处。那就是为什么我考虑在缓冲输出上使用查找/替换。另一个问题是允许 www.example.com 和 example.com 都可以工作......我已经为此被烧毁了,因为有人只允许 www.example.com 通过他们的内容过滤而不是 example.com
    • @Guttsy 通过找出您当前使用的协议并相应地定义BASE_URL 来轻松切换。
    • 对我有用(尽管我仍然会应用带有输出缓冲的 BASE_URL,因为我可以。)
    • 添加域名是大材小用。没有聪明的开发者会使用它。当然不包括 SO 理论家
    【解决方案2】:

    你已经拥有了你需要的一切

    当您更改当前目录时,如何确保与网站其余部分的相对链接正常工作?

    我们为此使用绝对链接

    当我转到支持目录时,我不希望我的“/index.php”链接实际链接到“/support/index.php”。

    幸运的是,它永远不会发生

    /index.php 是绝对路径,永远不会指向/index.php 之外的任何地方。

    / 不只是为了装饰。路径开头的斜杠的意思是“根目录”。所以,/index.php 表示 index.php placed in the root directory.
    /support/index.php 表示 index.php placed in the support directory which is placed in the root
    十分简单。只是总是使用绝对路径(不是毫无意义的 URL)

    【讨论】:

    • 不适用于可在子目录中使用的可移植 Web 应用程序。如果这永远不会发生,那就没关系。
    • @Unicron 你说的是在没有安装网络服务器的本地 Windows 系统上编辑愚蠢的 HTML 文件吗?哦,是的,这可能是个问题
    • 是的,如果我以这种方式保持一切绝对,那很好。无论如何,一切都很有可能留在网站的根目录。 (但是,我在写这个问题时确实搞砸了......我并不完全打算用“/”来表示根。也许“./”或者没有斜线会更好。)
    • @Col 不,我说的是一个 Web 应用程序,它可以安装在任何类型的服务器上的任何类型的子目录中(例如,example.com/blog 用于博客应用程序)。
    • 我很惊讶我必须解释这样一个该死的基本事情。世界上每个人都只是使用绝对路径,但当地的疯狂发明者无法忍受如此简单的解决方案。他们至少需要一个框架来解决路径问题
    【解决方案3】:

    我将“基本”URI 存储在两个位置:(i) 在 PHP/Zend 框架服务器上,我的 configuration.xml 文件保存常规值,例如 URI; (ii) 在客户端,一个更浅、更隐藏的&lt;form/&gt; 包含其他(安全性较低的)值,例如基本 URI。

    顺便说一下,表格看起来像这样:

    <form id="AppSettings" action="#">
        <input type="hidden" id="MyBaseUri" value="http://superuser.com"/>
    </form>
    

    【讨论】:

      【解决方案4】:

      将&lt;base href="http://www.domain.com/"&gt; 添加到您的&lt;head&gt; 标记中。这将使所有相对链接从href 给出的目录开始。然后使用不以/ 开头的support/index.php 等相对链接(即不是/support/index.php)

      注意:将&lt;base&gt; 标记作为&lt;head&gt; 部分中的第一个标记,因为之后的所有链接都将从该基本目录解释。 (例如,&lt;link href="relative/path"&gt; 将已经使用上面定义的基本目录。

      优势:您可以将整个页面移动到@987654321@ 等子目录,并且只需更改&lt;base&gt; 标记。如果您使用/support/index.php 之类的链接,它们将始终从根目录开始(即@987654322@)

      用于 url 重写的动态基础目录:

      <?php
          if  (preg_match("/https/i",$_SERVER["SERVER_PROTOCOL"]))
              $protocol = "https";
          else
              $protocol = "http";
          echo '<base href="'.$protocol.'://'.$_SERVER["HTTP_HOST"].dirname($_SERVER["SCRIPT_NAME"]).'/">';
      ?>
      

      【讨论】:

      • 看看@Guttsy,它是如何发生的 - 模拟 relative 目录的肮脏而漫长的方式:)
      • @Col。弹片:请解释一下“脏补丁”
      • 您正在对事物进行改进,不需要任何改进。曾经在现实生活中使用过您在此处发布的如此可怕的构造吗?
      • 你们倾向于把事情复杂化。不知道为什么。为什么不使用简单的解决方案?为什么要添加不必要的代码?例如,查看 SO 源。他们使用那个荒谬的标签吗?不,有没有想过为什么?那只是没用!当绝对路径没问题时,没有人需要它来处理资源。
      • 考虑将整个页面移动到子目录。来自根目录的绝对链接将是错误的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      • 2011-11-29
      • 2015-05-25
      • 2011-05-11
      • 1970-01-01
      相关资源
      最近更新 更多