【问题标题】:How to set the DOCUMENT_ROOT and site root in my local PHP dev setup?如何在我的本地 PHP 开发设置中设置 DOCUMENT_ROOT 和站点根目录?
【发布时间】:2010-10-21 20:21:09
【问题描述】:

我正在为一个拥有在线网站的人做一份工作。这对我来说是一个陌生的网站,我正在慢慢处理奇怪的代码。我在本地有 MAMP,我的 http://localhost/ 有很多客户端文件夹来自那里。在这段代码中,有很多 $_SERVER['document_root'] 命令和引用,例如 ,它们只是在我本地的 PHP 开发区迷路了。

我怎样才能轻松地将 document_root 引用设置为它应该是什么(虽然只是在本地,但我真的不想弄乱站点文件,因为我需要再次上传它们并且不想破坏现场网站!有没有一种间接设置的方式,PHP 认为该网站的根目录是这样的,所以图像的 src 引用“/images/...”将正确显示...我这个网站的本地 PHP 开发 URL 是:@ 987654322@ ...但在代码中 '/images/...' 开头的 '/' 引用 http://localhost:8888/ ??

谢谢。

【问题讨论】:

    标签: php settings document localhost root


    【解决方案1】:

    @Eddie's answer 帮了我很多,但我仍然需要做一些额外的研究来为自己在 OSX 上使用 XAMPP 解决同样的问题。为了后代的利益,我想我会在这里添加我的完整解决方案。

    首先我将以下条目添加到 httpd-vhosts.conf(在 XAMPP 中的“etc/extra/”文件夹下):

    NameVirtualHost *:80
    
    <VirtualHost *:80>
        ServerName localhost
        DocumentRoot "/Applications/xampp/xamppfiles/htdocs/"
    </VirtualHost>
    <VirtualHost *:80>
        ServerName client1.my-machine
        DocumentRoot "/Applications/xampp/xamppfiles/htdocs/clients/client1/"
    </VirtualHost>
    <VirtualHost *:80>
        ServerName client2.my-machine
        DocumentRoot "/Applications/xampp/xamppfiles/htdocs/clients/client2/"
    </VirtualHost>
    

    请注意,我专门为 VirtualHost url 使用了通配符而不是“localhost”,并在我指定每个子域名的位置添加了 ServerName 配置。另请注意,我使用了我的机器名称(“my-machine”)而不是“localhost”——这样可以正确评估来自任何机器(不仅仅是 localhost)的所有请求。我在 OSX 中开发,但通过 Parallels 在各种 VM 中测试浏览器。使用这种方法,我可以从网络上的任何机器或 VM 访问http://client1.my-machine。指定“localhost”后,它只能在我的开发机器上运行。

    注意:第一个 VirtualHost 条目用作默认值(如此处所述:http://httpd.apache.org/docs/2.2/vhosts/name-based.html)并且是必需的,因此请求不会默认发送到自定义站点之一。

    我还将权限设置添加到 httpd.conf,如@Eddie's answer 所示。这并不总是必需的,但我遇到了两个不同的情况,我需要进行此更改:

    • 在默认 XAMPP http 根目录之外的目录中创建新站点(基本上任何可通过 http 访问的路径都必须设置明确的权限)
    • 为设置为虚拟主机的站点添加 mod_rewrite 规则(在默认 http 路径下),我收​​到错误“.htaccess: RewriteEngine not allowed here”。在 httpd.conf 中阅读有关 AllowOverride 选项的 cmets 会使错误的原因显而易见,但我之前忽略了这一点。将此更改为“全部”可修复错误。

    请注意,在编辑 httpd.conf 时,您可能需要取消注释以下行(默认情况下已为我注释掉),否则上面所做的 vhosts 更改将不会生效:

    # Virtual hosts
    Include /Applications/xampp/etc/extra/httpd-vhosts.conf
    

    最后,我还必须将自定义域名添加到我的主机文件中,如上面的 cmets 中所述。在 OSX 上,您可以通过编辑“/private/etc/hosts”(在 Windows 上为“Windows/System32/drivers/etc/hosts”)并添加以下行来完成此操作:

    127.0.0.1   my-machine
    127.0.0.1   client1.my-machine
    127.0.0.1   client2.my-machine
    

    注意:在默认的 OSX Finder UI 中,隐藏文件夹(包括 /private)不可见。您可以通过破解内部 Finder 选项(Google 了解详细信息)永久更改此设置,或者更简单地进行偶尔更改,只需使用“Go > Go to folder”菜单选项,您可以直接按名称打开隐藏文件夹。就我个人而言,我使用了一个名为PathFinder 的第三方 OSX shell,我衷心推荐它(值得支付少量许可费)。它包括一个用于隐藏/显示隐藏文件的菜单选项,以及许多其他有用的功能。

    拖累的一件事是,我还必须在指向我的物理开发机器的 Windows VM 主机文件中添加匹配条目,以便通过 Apache/OSX 解析 url:

    192.168.1.5 client1.my-machine
    192.168.1.5 client2.my-machine
    

    我不需要单独的机器名称条目(自动解析),但是如果没有这些主机条目,将子域添加到它不会正确解析。有时我的 Mac 的 IP 更改(通过 DHCP)确实很糟糕,但这是一个小麻烦。我假设我可以将其设置为不需要这些 IP,但我无法弄清楚并准备继续前进:)(如果有人知道答案,请发表评论)

    现在我有多个客户端站点在一个地方运行,并且可以从我的所有开发/测试环境中访问。希望这对其他人有帮助。

    【讨论】:

      【解决方案2】:

      我推荐的是虚拟主机,这样您就可以在本地提供“外星站点”而不会弄乱您的默认网络服务器。

      • localhost -> 您的起始页或其他任何内容
      • alien.localhost -> 客户端站点,无论您想要什么路径/文档根目录。
      • x.localhost -> 另一个站点

      在 apaches 全局配置文件中或包含在 vhost.conf 中;

      NameVirtualHost localhost:80
      # the mysql tool's url
      <VirtualHost phpmyadmin.localhost:80>
      # and absolute path
      DocumentRoot "/srv/www/phpMyAdmin/"
      </VirtualHost>
      
      #Same for the Client Site
      <VirtualHost foo.localhost:80>
      DocumentRoot "/path/to/desired/webroot/"
      </VirtualHost>
      

      您可以通过首先指定以下内容来控制权限并设置全局站点

      在 apache 的全局服务器配置中

      DocumentRoot "/srv/www/htdocs"
      #
      # Configure the DocumentRoot Properties
      #
      <Directory "/srv/www/htdocs"> 
          Options All
          # AllowOverride controls what directives may be placed in .htaccess files.
          # It can be "All", "None", or any combination of the keywords:
          #   Options FileInfo AuthConfig Limit
          AllowOverride All
          # Controls who can get stuff from this server.
          Order allow,deny
          Allow from all
      </Directory>
      #
      # Configure Sub-Domain Properties. This prevents those nasty 403 errors
      #
       
      # mysql administration tool
      <Directory "/srv/www/phpMyAdmin/">
          Options Indexes MultiViews
          AllowOverride All
          Order allow,deny
          Allow from all
      </Directory>
       
      # a client web site built with CakePHP
      <Directory "/home/eddie/workspace/Digital_Business/app/webroot/">
          Options All
          AllowOverride All
          Order allow,deny
          Allow from all
      </Directory>
      

      【讨论】:

      • 这看起来很完美。但完全按照你说的做了,在 MAMP 上重新启动了 Apache,确保所有文件路径都与我相关......什么都没有!当我将地址放入浏览器时不起作用...
      • 是的,我认为在这种情况下最好简单地保留代码并正确配置 Apache。无论如何,这是正确的做法。
      • James,在 Windows 上,您可能需要编辑主机文件:en.wikipedia.org/wiki/Hosts_file
      • 我很确定这也适用于基于 Unix 的系统。 (主机文件将在 /etc/hosts 中)。
      • @James,Calvin 和 htw 是正确的。您需要设置系统的主机文件,以知道whatever.localhost 是解析为127.0.0.1(环回)的有效URL 一旦设置好,Apache 将接收请求并接管。
      【解决方案3】:

      对于当前的流程,你可以这样做

      $_SERVER["document_root"] = "随便";

      不过要小心。

      【讨论】:

        【解决方案4】:

        这是特定于服务器的设置。如果您正在运行 Apache,您需要做的就是编辑您的 httpd.conf 文件(在基于 Unix 的系统上,它应该位于 /etc/apache2/httpd.conf/etc/httpd/httpd.conf,具体取决于您拥有的 Apache 版本) )。文件中应该有如下一行:

        #
        # DocumentRoot: The directory out of which you will serve your
        # documents. By default, all requests are taken from this directory, but
        # symbolic links and aliases may be used to point to other locations.
        #
        DocumentRoot "/whatever/your/document/root/is"
        

        从技术上讲,Eli 的方法也很有效,但总的来说,我认为编辑服务器变量并不是一个好主意。

        【讨论】:

          【解决方案5】:

          也许您会发现以下网站很有用。有一些简单易学的教程向您展示了要操作哪些设置来设置您满意的 this'n'that。我在那里找到了很多解释。

          Tanguay's tutorial

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-01-06
            • 2011-02-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-03-05
            相关资源
            最近更新 更多