在非根位置部署的绝对路径

时间:2011-11-14 14:34:03

标签: html apache deployment web-deployment

我通常使用绝对路径来引用我网站上的任何资产,这样我就不必担心资产相对于当前文件的位置。

<!-- Using a absolute path. -->
<img src="/images/flag.png" />
<!-- Using a relative path. -->
<img src="../../../images/flag.png" />

但是,这次我需要在非根位置托管网站,例如http://my-server.com/holiday/

我该怎么做?我正在寻找一个不需要我更改文件路径的解决方案。如何配置服务器(Apache)以将http://my-server.com/holiday/视为“root”?

澄清: 我仍然需要http://my-server.com/表现“正常”。也就是说,它仍应指向http://my-server.com/index.html,即不会重定向到http://my-server.com/holiday/

8 个答案:

答案 0 :(得分:2)

如果您正在使用Apache,只需在路径中使用SSI变量就可以做到一件非常简单的事情。 全局替换所有src =“/到

之类的东西
src="<!--#echo var="prefix" -->/

然后在特定文件夹的htaccess中将前缀变量定义为/ holiday

对于没有变量或SSI的网站,它只会显示为注释,或者您可以将其定义为空字符串。

当然这意味着你必须在Apache中启用SSI。

答案 1 :(得分:1)

尝试将此添加到.htaccess

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?DOMAINNAME.com$
RewriteCond %{REQUEST_URI} !^/holiday/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /holiday/$1
RewriteCond %{HTTP_HOST} ^(www.)?DOMAINNAME.com$
RewriteRule ^(/)?$ holiday/index.php [L]

或者看看这里 - Changing the root folder via .htaccess

答案 2 :(得分:0)

我不认为这会发生在你身上,对不起。

你的文档中有绝对路径,并希望apache在不影响实际docroot的情况下为它们添加/假期吗?您可以拥有一个或另一个,但不能同时拥有两个。

您需要自己进行批量编辑并预先添加目录,或将images / css / etc移动到实际的根目录中。

mod_rewrite功能强大,但无法真正确定意图并根据用户的需要以两种不同的方式解析相同的URL。

修改

我错了,但我没有你的答案。您可以在mod_rewrite中使用IS_SUBREQ来仅对来自/holiday/index.php的子请求应用重写条件

答案 3 :(得分:0)

容易......

# Assuming mod_rewrite is an option...
<IfModule mod_rewrite.c>
   # Turn it on!
   RewriteEngine on

   # If path is /images/flag.png, connect to /holiday/images/flag.png
   RewriteBase /holiday/
</IfModule>

假设我理解你的意思,这应该对你很好。程序问题,这个.htaccess应该在/ holiday /

我在MAMP本地做这个测试一个基础在http://localhost:8888/SocialNetwork/的网站...如果我没有那个,我的绝对路径,比如,/profile会转到{{ 1}}而不是http://localhost:8888/profile/

答案 4 :(得分:0)

使用html的BASE元素怎么样? http://www.w3.org/TR/html4/struct/links.html#h-12.4

虽然我不确定如何将它放在一个单独的html文件中并将其继承到其余的htmls,所以你的源码保持不变。 如果你的网站是html-only可能有框架,否则你可以使用某种服务器端包含取决于你使用什么(asp,jsp,等等)。有关详细信息,请查看此链接http://www.boutell.com/newfaq/creating/include.html

答案 5 :(得分:0)

我不想这样说,但上述都没有提供解决方案。 @Zoltan和@stslavik的答案很接近,但不幸的是,部署时没有用;我希望他们中的一个能够工作。

因此,我在PHP中使用了named constantsinclude files的组合。更多细节:File Structure for a PHP Project。请注意,它不必是PHP;您可以使用其他提供类似功能的语言。为@margusholland +1,他的回答让我试验了这个解决方案。

答案 6 :(得分:-1)

编辑:

当然,如果你使用php,它会起作用。添加:

<? define(_BASE_, substr($_SERVER['SERVER_NAME'] . "/" . $_SERVER['REQUEST_URI'], 0, strrpos($_SERVER['REQUEST_URI'], "/" )) ); ?>

<html>

    <head>
        <script src="<?=_BASE_?>/path_relative_to_project_root"></script>
    </head>

    <body>
        <img src="<?=_BASE_?>/path_relative_to_project_root">
    </body>

</html>

答案 7 :(得分:-1)

如果您有一个应该重定向的文件扩展名列表,您可能希望在扩展名中使用模式匹配来重写条件。

另一个解决方案是在root下创建一个/ images目录,然后从那里下载图像。或者链接到您路径中的图像。