XAMPP中的根路径

6

我一直遇到这个问题,但是迫于无奈,我在各处搜索也没有找到答案。

 <img src="/images/test.jpg" /> 

从根路径(在我的情况下是LAMP生产环境中的根路径)获取图像

 htdocs/images/test.jpg 

无论是从htdocs/index.php还是htdocs/foo/bar/index.php调用,我在开发中使用XAMPP,在htdocs内有项目文件夹,因此上述方法虽然在实际运行时有效,但需要我进行修改:
<img src="/projectName/images/test.jpg" /> 

在本地工作时。

为了让这更简单,我定义了一个常量BASE,在开发中我使用:

define('BASE','/projectname/) 

然后当它上线时,我会改变为:

define('BASE','/')

<img src="<?php echo BASE;?>images/test.jpg" />

这显然非常令人恼火,会导致多个问题。请有经验的人阐述一下这种情况,我特别想做的是在我的图像/脚本源中使用根路径,但需要注意以下几点:

<img src="/images/test.jpg" />

从htdocs/projectName/foo/test.php调用时

要查找的图像路径:

htdocs/projectName/images/

这个可行吗?
6个回答

6
另一种处理方式是使用虚拟主机。虚拟主机就像是本地主机的第二个版本,专门用于子文件夹。例如,您可以设置Apache,使得当您访问http://example(没有.com或任何其他内容)时,它会显示来自http://localhost/example/的内容。所有CSS、JavaScript和链接都将像从网站的根文件夹操作一样,因为URL中的前导example文件夹已被删除。我找不到我曾经用于XAMPP的演示文稿,但这里有一个类似的涵盖了所有主要要点。它是为Windows编写的,但我想你也可以使用类似的机制来使用LAMP:总之,文章告诉您要做什么:
  • 启用Apache中的虚拟主机
  • 设置当您访问example时,您将被发送到127.0.0.1
  • 配置Apache使得当有人访问127.0.0.1(但网站名称是example)时,它会显示来自example文件夹的内容。

这就是您的生产站点(一个具有多个网站的单个服务器)每个网站都有不同的“根目录”的方法。


谢谢,这正是我在寻找的,我会在23小时内授予奖励。 - JohnnyFaldo
刚刚实现了这个功能,完美运行,再次感谢@Chris。 - JohnnyFaldo

3
你有没有想过html内容头部的base标签?http://www.w3schools.com/tags/tag_base.asp
<head>
    ...
    <base href="<$path />">
    ...
</head>

获取基本路径:

$path = $_SERVER['SERVER_NAME'] == 'production.host' ? '/' : 'projectName';

是的,在那里定义它或者像我目前做的那样仍然需要在开发和生产之间编辑它的定义,因为它仍然会改变。 - JohnnyFaldo
要在生产模式和开发模式之间进行选择,您可以使用 $_SERVER['SERVER_NAME'] - Philipp

2
您可以尝试其他人在此线程中提供的解决方案(即编程解决方案),或者作为替代方案,我会做一些不同的事情(安装设置方案)。
对于我来说,我喜欢创建一个独立的环境,在这个环境中,我的项目和开发文件与XAMPP尽可能分离(我正在使用XAMPP,但原则适用于其他托管环境)。这使我能够轻松安装XAMPP的新更新,而不必担心我的项目,并且我也喜欢将所有项目放在一个专门用于开发的文件夹中。这个开发文件夹将包含用于Web、移动和其他环境的项目。
我设置的方式是,我有一个名为 c:\ dev \ 的文件夹,其中包含我的项目列表,每个项目都是独立的。所以,例如, c:\ dev \ project1 \ , c:\ dev \ project2 \ 等等。
现在,在我为开发创建这些文件夹之后,我确保 httpd-vhosts.conf 文件(位于 c:\ xampp \ apache \ conf \ extra \ )和 hosts 文件(位于 c:\ Windows \ System32 \ drivers \ etc \ )具有正确的引用。
假设我的一个项目叫做 project1 。它通常位于 c:\ xampp \ htdocs \ project1 ,那么我通常会通过浏览器访问它,如 http:// localhost / project1 然而,为了拥有独立的环境,并且正如前面所解释的那样,我会在 c:驱动器中创建一个开发文件夹,称为 c:\ dev ,然后将 project1 移动到其中,并最终得到 c:\ dev \ project1 然后,为了通过在Web浏览器中键入 project1.dev 来访问该项目,我在 c:\ xampp \ apache \ conf \ extra \ 中附加了 httpd-vhosts.conf 文件,如下所示:
<VirtualHost project1.dev:80>
    ServerAdmin admin@project1.dev
    DocumentRoot "C:/dev/project1"
    ServerName project1.dev
    ServerAlias www.project1.dev
    ErrorLog "logs/project1.dev.error.log"
    CustomLog "logs/project1.dev.access.log" combined

    <Directory "C:/dev/project1">
        Options Indexes FollowSymLinks Includes ExecCGI
        AllowOverride All
        Order allow,deny
        Allow from all
        Require all granted
    </Directory>

</VirtualHost>

另外,我需要更新 hosts 文件(位于 c:\Windows\System32\drivers\etc\),并添加以下条目:

127.0.0.1    project1.dev
127.0.0.1    www.project1.dev

(其中127.0.0.1与localhost相同。另外请注意,您必须在hosts文件中添加第二个条目以用于www别名)。

这使我可以访问我的项目:http://project1.dev

设置完成后,我现在可以为我的开发和生产环境编写一致的代码,并且对根目录的引用将正常工作。

此外,通过这种设置,我不需要担心是否需要更新XAMPP或切换到LAMP或其他任何事情,我只需要确保处理一个文件,即我的设置文件httpd-vhosts.conf。正如我提到的,我总是喜欢为开发建立单独的文件夹,并且我可以在开发环境中拥有不同类型的项目,例如移动项目、Web项目等等。

希望这能帮到您。


关于多站点(子域设置)的说明

如果您想要设置多站点(子域设置),则在按照WordPress说明启用WordPress多站点之后,您需要执行以下操作:

假设您想要使用以下结构进行多站点设置:

project1.dev
www.project1.dev (this is an alias to project1.dev)
sub.project1.dev (this is another setup, subdomain)

然后,您需要将以下条目添加到httpd-vhosts.conf中。
<VirtualHost sub.project1.dev:80>
    ServerAdmin admin@project1.dev
    DocumentRoot "C:/dev/project1"
    ServerName sub.project1.dev
    ErrorLog "logs/sub.project1.dev.error.log"
    CustomLog "logs/sub.project1.dev.access.log" combined

    <Directory "C:/dev/project1">
        Options Indexes FollowSymLinks Includes ExecCGI
        AllowOverride All
        Order allow,deny
        Allow from all
        Require all granted
    </Directory>

请更新 hosts 文件以包含以下内容:

127.0.0.1    www.project1.dev

请注意,DocumentRoot指向主站和子域站点的同一目录。
在WordPress网络中添加每个新子域时,请重复此过程。

1
如果有用的话,我会做类似的事情来在我的开发服务器和托管服务器之间切换数据库。没有理由它不能适用于基础URL。
// db connect
if($_SERVER['SERVER_NAME'] != "dev.mydomain.org"){
    try{
        $pdo = new PDO('mysql:host=mysql.***.net;dbname=***;charset=utf8', '***', '***');
    }catch(PDOException $ex){
        header('Location: error_db.php');
    }
}else{
    try{
        $pdo = new PDO('mysql:host=localhost;dbname=***;charset=utf8', '***', '***');
    }catch(PDOException $ex){
        header('Location: error_db.php');
    }
}

1

我认为最好的方法是使用baseurl,在配置文件中设置您的baseurl并将其用于外部文件。

$config = new Config();
public $baseurl = "http://dev050.nl";

你可以将其用作

,然后


$config->baseurl;

也许这对你有些趣味:

http://twig.sensiolabs.org/

希望它能帮到你。


谢谢,但我正在寻找一种不需要编辑即可实时运行的解决方案。 - JohnnyFaldo
@JohnnyFaldo 这个解决方案应该适合你。你需要做的就是创建一个 config.php 文件,将所有部署特定的变量放在里面,并在你的 PHP 文件中使用 include() 引入它。 - AeroX
@AeroX 这就是我目前所做的,我有一个config.php文件,其中定义了基本URL等内容,并在整个项目中被包含。我需要的是一种方法(或替代方法),可以使用htdocs子文件夹作为基本根目录,而不是它的父文件夹httpdocs,来代替xampp。 - JohnnyFaldo

0
一个可能的解决方案是使用mod_rewrite自动更改您的开发服务器上的路径。
RewriteCond %{HTTP_REFERER} ^https?://localhost/testsite/
RewriteCond %{REQUEST_URI} \.(jpg|gif|png|bmp)$
RewriteRule ^ /testsite/$1

我相信上面的mod_rewrite规则是正确的,但最好自行验证一下。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接