14

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

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

谢谢你。

4

5 回答 5

8

@Eddie 的回答对我帮助很大,但我仍然需要做一些额外的研究来为自己在 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所示。这并不总是必需的,但我遇到了 2 个需要进行此更改的不同情况:

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

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

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

最后,我还必须将自定义域名添加到我的主机文件中,如上面的评论中所述。在 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 主机文件中添加匹配的条目,以便 URL 可以通过 Apache/OSX 解析:

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

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

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

于 2009-07-09T15:12:59.287 回答
6

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

  • 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>
于 2009-04-25T23:03:57.060 回答
2

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

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

不过要小心。

于 2009-04-25T22:15:32.823 回答
2

这是特定于服务器的设置。如果您正在运行 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 的方式也很有效,但总的来说,我认为编辑服务器变量并不是一个好主意。

于 2009-04-25T22:23:35.923 回答
0

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

Tanguay的教程

于 2009-04-25T22:18:30.727 回答