【发布时间】:2014-10-21 16:12:53
【问题描述】:
我找不到做我想做的事的方法。我想上传一个项目到我的服务器http://example.com/MyNewProject
在每个网页中,我都包含一个文件,该文件执行样式表、JavaScript 等的所有导入。我不想每次都提供完整路径,我只想能够做到/MyStylesheet.css
我的主要网站文档根目录是/var/www/html/example,我的新项目目录存储在/var/www/html/example/MyNewProject 中。
当我执行 /MyStylesheet.css 时,我想要的是在我的导入中,而不是转到我的服务器主 Web 目录,而是转到 /var/www/html/example/MyNewProject 以获取 CSS。
我已尝试将以下内容添加到我的 Apache 配置文件中:
Alias /NewProjectTemplate "/var/www/html/example/NewProjectTemplate"
Alias /NewPRojectTemplate/ "/var/www/html/example/NewProjectTemplate"
<Directory "/var/www/html/example/NewProjectTemplate">
Options Indexes FollowSymLinks Includes
AllowOverride All
XBitHack On
Order allow,deny
Allow from all
</Directory>
不幸的是,这没有奏效,所以我也尝试将以下内容添加到我的虚拟主机文件中
<VirtualHost *:80>
DocumentRoot /var/www/html/example/NewProjectTemplate
ServerName example.com/NewProjectTemplate
</VirtualHost>
我在 Google 上环顾四周,但找不到任何具体的东西,我发现的唯一东西与使用 Rewrite 引擎有关,但这似乎有点太复杂,而且 OTT 不适合我的需要。
更新
我还有一点,虽然不是很多,但我相信它不应该这么复杂。
我现在使用别名而不是使用虚拟主机,下面是我添加到我的 httpd.conf 文件中的内容
DocumentRoot "/var/www/html"
Alias /NewTemp/ "/var/www/html/example/NewProjectTemplate/"
Alias /NewTemp "/var/www/html/example/NewProjectTemplate"
<Directory "/var/www/html/example/NewProjectTemplate/">
Options FollowSymLinks Includes
AllowOverride all
</Directory>
<Directory "/var/www/html/example/NewProjectTemplate">
Options FollowSymLinks Includes
AllowOverride all
</Directory>
在我的 SSI 中的 HTML 代码中,我正在执行以下操作:
<!--#include file="includes/imports.html"-->
如您所见,这是一个相对路径,并且 Includes 位于 NewProjectTemplate 的根目录中。但是,这是一个模板文件,所以我希望它始终能够到根目录中找到该文件,因此无论站点有多深,它都能保证工作。例如,如果我将行更改为下面的行,则会收到错误 error processing directive
<!--#include file="/includes/imports.html"-->
因此,即使它在没有 / 但没有斜杠的情况下工作,如果我不包含斜杠,那么这个导入就可以工作,imports.html 文件中的导入工作,即使它们确实包含前导斜杠所以它总是去根。下面是我的 HTML 导入文件
<link rel="stylesheet" type="text/css" href="/StyleSheet.css">
<link rel="stylesheet" type="text/css" href="/navigation/top-nav.css">
<link rel="stylesheet" type="text/css" href="/navigation/side-nav.css">
<script type="text/javascript" src="/scripts/jquery.js"></script>
<script type="text/javascript" src="/scripts/menu.js"></script>
所以澄清一下,如果 #include 文件 = includes/imports.html SSI 指令有效并且 /StyleSheet.css 成功导入,即使它有前导斜杠。如果我将 / 添加到 SSI 的路径,则它不会被导入。
但这里变得更奇怪了。
如果我随后将另一个文件添加到子目录,例如NewProjectTemplate/MySubDirectory 然后将 SSI 添加为 ../includes/imports.html 它仍然不起作用。就像#include file SSI 指令要求文件在同一个工作目录中一样。
【问题讨论】:
-
在我们的 PHP 代码中,我们创建了一个分析当前 URL 的 Environment 对象,并根据 URL 中找到的子目录确定我们的“baseWebPath”。这是基于模板的解决方案的基础,无论脚本的位置如何,我们始终可以使用相同的相对路径包含我们的 javascript 和 css,例如“javascript/myscript.js”。据推测,您试图避免像“../javascript/myscript.js”和“../../javascript/myscript.js”这样的引用。我的建议是使用基于 PHP 的方法,而不是尝试找到基于 Apache 的解决方案。