【问题标题】:Treating a subdirectory as a root directory for Apache将子目录视为 Apache 的根目录
【发布时间】: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

&lt;!--#include file="/includes/imports.html"--&gt;

因此,即使它在没有 / 但没有斜杠的情况下工作,如果我不包含斜杠,那么这个导入就可以工作,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 的解决方案。

标签: html apache


【解决方案1】:

那么,你有没有在虚拟主机中这样尝试过?

<VirtualHost *:80>
    ServerAdmin emailaddress@domain.com
    DocumentRoot "/var/www/html/example/"
    ServerName example.local
    ServerAlias example.local
    <Directory "/var/www/html/example/">
        Options All Includes Indexes FollowSymLinks
        Order allow,deny
        Allow from all
        AllowOverride All
    </Directory>

    Alias /NewProjectTemplate /var/www/html/example/NewProjectTemplate
    <Directory "/var/www/html/example/NewProjectTemplate">
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

希望这次能有所帮助..

【讨论】:

  • 这不是我问的,这实际上改变了我的网络服务器的域。 URL 仍应为 example.com/NewProjectTemplate,但 NewProjectTemplate 被视为根
  • 谢谢 我已经尝试过了,但似乎没有用。我仍然收到 PHP 错误,说它找不到 /includes/imports.html。 /includes 位于 NewProjectTemplate 的根目录中。所以我认为它必须在网络服务器根目录中查找
  • 我认为你很接近。尝试在浏览器控制台中查看它正在寻找的路径...
  • 浏览器的控制台说它要去http://example.com/StyleSheet.css而不是http://example.com/NewProjectTemplate/StyleSheet.css
  • 尝试访问浏览器中的别名 url 以检查它是否真的有效...如果问题继续发生,您可以为此定义一个带有基本 url 的变量...设置一个变量 newProjectTemplate = example.com/NewProjectTemplate 在您的配置文件中并像 newProjectTemplate 一样调用。 “StyleSheet.css”...只是一种解决方法..
【解决方案2】:

只是偶然发现了这个非常古老的威胁。 如果您只想将子目录视为根目录,则不需要主机或别名。

方法是修改httpd.conf,在那里你会发现

<Directory>

只需更新这一行并添加

<Directory "your/server/root/original_path/subpath">
    # your options
</Directory>

【讨论】:

    猜你喜欢
    • 2014-10-24
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 2011-08-24
    • 2015-03-09
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    相关资源
    最近更新 更多