【问题标题】:Safe way to write URLs that transfer across environments编写跨环境传输的 URL 的安全方法
【发布时间】:2013-07-14 18:49:06
【问题描述】:

我目前正在本地机器上开发一些软件。为了这个问题,让我们调用软件StackOverflow。我有以下页面

C:\sites\StackOverflow\index.php
C:\sites\StackOverflow\content\page1.php
C:\sites\StackOverflow\content\page2.php
C:\sites\StackOverflow\content\page3.php

在我当前的环境中,http://localhost/StackOverflow/index.php 工作成功。我为内容页面编写的 URL 看起来类似于 http://localhost/StackOverflow/content/page1.php。

当我将它部署到生产环境时,URL 将不再是本地主机,而是尚未确定的 IP 或主机名。我应该如何编写我的 URL,以便在部署时尽可能少做工作?

【问题讨论】:

    标签: php url localhost href production-environment


    【解决方案1】:

    如果你想要动态的,你可以这样做:

    $pathInfo = pathinfo($_SERVER['SCRIPT_NAME']);
    $baseUrl = rtrim($pathInfo['dirname'], "\\/");
    

    我将此 baseUrl 保存在我的请求对象中并在我的视图脚本中使用它。这取决于你..

    像这样使用它:

    <a href="<?php echo $baseUrl; ?>/content/page1.php">Test</a>
    

    例如,如果您发送电子邮件并需要链接回网站,则有时您需要绝对网址:

    $rootUrl = 'http';
    if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') {
        $rootUrl .= 's';
    }
    $rootUrl .= '://'.$_SERVER['SERVER_NAME'];
    if ($_SERVER['SERVER_PORT'] != '80') {
        $rootUrl .= ':'.$_SERVER['SERVER_PORT'];
    }
    $rootUrl .= $baseUrl;
    

    $rootUrl 的使用方式与 $baseUrl 相同。

    【讨论】:

      【解决方案2】:

      始终使用相对 URL,以便不仅可以在服务器之间传输站点,还可以在同一服务器中的目录之间传输站点。

      Relative 通常从您当前的文件位置开始。通常我的 index.php 包括其他文件。所以,它都是相对于根位置的:

      ./ means same path
      ./test/ means one level up
      ../ means 1 level-below
      ../../ means 2 levels-below etc
      

      见

      http://www.webdevelopersnotes.com/design/relative_and_absolute_urls.php3

      【讨论】:

        【解决方案3】:

        我总是在配置文件中分配几个常量,并以此为基础。

         if ($_SERVER["APP_ENVIRONMENT"] == "development"){
           define("BASE_PATH", "C:/sites/StackOverflow/development/");
           define("BASE_URL", "/development/");
         } else {
           define ("BASE_PATH", "/home/www.mysite.com/htdocs/");
           define ("BASE_URL", "/");
         }
        

        然后在做 url 的时候,我会像这样构造路径

         $url = BASE_URL."path/to/whatever.jpg";
        

        对于文件参考

         include (BASE_PATH."libraries/mylib.php");
        

        您可以使用 PutEnv 在每个环境的基础上在 htaccess 中设置 $_SERVER["APP_ENVIRONMENT"]

        SetEnv APP_ENVIRONMENT development
        

        【讨论】:

          【解决方案4】:

          我通常在我的应用程序的配置文件中设置一个 $baseurl 和一个 $basepath 变量,指向我的应用程序的根目录,在我的前端,我只是在我的 url 前面加上这些变量。

          通过这种方式,您可以轻松地将您的网站从一台服务器转移到另一台服务器,并且它也适用于子目录中的应用程序

          【讨论】:

            【解决方案5】:

            您不需要绝对的 http 路径,如果您使用 HTTPS,这实际上可能会出现问题,因为其中任何一个仍指向 HTTP 的链接都可能导致浏览器显示“不安全内容”错误

            // This allows you to deploy to different enviroments where some might
            // have the page _not_ in the site root, without having to edit
            // 1000s of lines of code.
            $config['baseurl'] = '/StackOverflow';
            
            // then when you echo an url you can just
            echo $config['baseurl'] . '/content/page1.php';
            

            【讨论】:

              【解决方案6】:

              相对于根目录启动它们:/。

              例如:

              /StackOverflow/index.php
              /StackOverflow/content/page1.php
              /StackOverflow/content/page2.php
              /StackOverflow/content/page3.php
              

              它们将自动以当前域或您设置为 &lt;base&gt; 的任何内容作为前缀。

              【讨论】:

              • 这对我来说似乎很基础,所以我不知道为什么我不能绕开它。如果我坐在page1.php 上并单击指向/StackOverflow/index.php 的链接。浏览器怎么知道我不打算去/StackOverflow/content/StackOverflow/index.php?
              • 如果您链接到 StackOverflow/index.php,就会发生这种情况。注意缺少根斜线。
              • 您可能会从阅读这些答案中受益 - stackoverflow.com/questions/2005079/absolute-vs-relative-urls
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-06-10
              相关资源
              最近更新 更多