如何使用 .htaccess 而不是 VHost 将文档根目录设置为子目录

Posted

技术标签:

【中文标题】如何使用 .htaccess 而不是 VHost 将文档根目录设置为子目录【英文标题】:How to set document root to be a subdirectory using .htaccess and not VHost 【发布时间】:2013-05-06 22:41:41 【问题描述】:

在我的本地机器上,以下工作完美:

 <VirtualHost *:80>
       ##ServerAdmin postmaster@dummy-host2.localhost
       DocumentRoot "C:/xampp/htdocs/website_1"
       ServerName testpage.com/website_1
       ##ServerAlias www.recruitement.localhost
       ##ErrorLog "logs/dummy-host2.localhost-error.log"
       ##CustomLog "logs/dummy-host2.localhost-access.log" combined
 </VirtualHost>

但是我将我的网站托管给名为 justhost.com 的托管公司,他们不允许我修改 httpd-vhosts.confhttpd.conf。现在我的整个网站都被编码了,因此 website_1 下的文件使用简单的斜杠“/”来引用 website_1 下的其他文件,这意味着 website_1 被视为文档根目录。这在本地机器上完美运行,但是当上传到主机时,它给了我服务器错误,因为找不到文件,因为它试图在 public_html

中找到这些文件

例如:

  public_html
      - website_1
         - script.php
         - style.css

在我的 script.php 中:

<a href="/style.css">See My Style</a>

这在本地机器上运行良好,但在主机上却失败了,因为它试图在 public_html 下而不是 public_html/website_1

下找到 style.css

有没有办法在不使用虚拟主机的情况下拥有多个文档根目录?就像使用 .htaccess 或其他东西一样。请我尽量避免重写代码,因为它大约有 10000 行代码。

【问题讨论】:

__DIR__ 怎么样或者你试过./ 吗? 我不想使用 ./ 也不想使用需要重组数千行代码的 DIR 我完全看不出你的问题。您的 vhost 定义中没有任何东西是非常奇怪的,或者需要一堆 .htaccess 规则。只需将 website_1 文件夹直接上传到您的主机上的 public_html,它应该可以正常工作。 但我无法使用 因为它会在 public_html 的根文件夹下查找 img_1 如果按照我的建议,将website_1 的内容直接上传到public_html,则图像会正常解析。在共享主机环境中,您必须接受一些预定义的通用事实,例如 DocumentRoot 固定在 DirectAdmin 服务器上的 public_html 文件夹中。 【参考方案1】:

通过httpd.conf启用mod_rewrite和.htaccess,然后把这段代码放到你.htaccessDOCUMENT_ROOT目录下:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

RewriteCond %DOCUMENT_ROOT/website_1/$1 -f [OR]
RewriteCond %DOCUMENT_ROOT/website_1/$1 -d [OR]
RewriteCond %DOCUMENT_ROOT/website_1/$1 -l
RewriteRule (?!^website_1/)^(.*)$ /website_1/$1 [R=302,L,NC]

一旦您确认它工作正常,请将R=302 替换为R=301。在测试你的 mod_rewrite 规则时避免使用R=301(永久重定向)。

【讨论】:

我无法访问 httpd.conf,因为它的托管公司不是专用服务器。 我需要用什么来替换 DOCUMENT_ROOT 吗? 我得到重定向循环。我应该将 .htaccess 放在 public_html 下还是 public_html/website_1 下? 正如我已经提到的,上面的代码将在DOCUMENT_ROOT/.htaccess 下。关于重定向外观,我可以知道你尝试了什么 URI 吗? 它将此代码添加到 htaccess 而不是您的第一行代码: # 出于安全原因,不能覆盖符号链接后的选项。 #Options +FollowSymlinks -MultiViews 选项 +SymLinksIfOwnerMatch -MultiViews【参考方案2】:

将所有图像请求重写为 root 可能是一种解决方案。您可以在根目录的一个 .htaccess 文件中尝试此操作:

Options +FollowSymlinks -MultiViews
RewriteEngine On
RewriteBase /

# Check if request is for an image at root. Add/remove file types if necessary.
RewriteCond %REQUEST_URI  ^/([^.]+)\.(png|jpg|gif|css) [NC]
RewriteCond %REQUEST_URI  !/website_1  [NC]
# Rewrite request to point to "website_1" directory
RewriteRule .*               /website_1/%1.%2          [L,NC]

【讨论】:

井图像是一个例子,它可能是不同的文件。 website_1 下的所有文件的文档根目录必须位于 /website_1 是的,只要扩展名符合条件,它就会映射所有图像文件,无论其名称如何。不,/website_1 不是justhost.com 的根目录。根据您的问题,它是public_html,我假设/website_1 是它下面的一个目录。但是,您是否尝试过答案中的代码,如果是,有什么错误或问题? 图片只是一个例子。如果我在 public_html/website_1/ 下有 index.php 和 style.css,我需要仅使用 /style.css 而不是 /website_1/style.css 从 index.php 中引用 style.css。上面的代码给了我 500 内部服务器错误 修改了我的答案,添加了.css 文件类型和一个防止循环的条件(500 错误)。 你能做到吗,所以如果它被请求 website_1 下的任何文件,它会从 website_1/ 加载它们?不仅是图像和 css,它还可以是 php、js 等【参考方案3】:

在 .htaccess 中创建一个条目。假设您有一个网站 abc.com。您想在目录中运行另一个网站。然后在指向 abc.com 的父目录中创建一个 .htaccess

RewriteEngine on

RewriteCond %HTTP_HOST ^abc.com$ [NC,OR]

RewriteCond %HTTP_HOST ^www.abc.com$ 

RewriteCond %REQUEST_URI !subdirectory/

RewriteRule (.*) /subdirectory/$1 [L]

【讨论】:

这对 Ignition-Go(CodeIgniter 项目)来说就像一个魅力

以上是关于如何使用 .htaccess 而不是 VHost 将文档根目录设置为子目录的主要内容,如果未能解决你的问题,请参考以下文章

显示“它有效!”的网站页面,而不是 vhost 配置中指定的内容

使用 htaccess 重写后,如何在 PHP 中获取可见 URL(不是实际 URL)? [复制]

htaccess 下载文件而不是加载

301 重定向没有子目录/查询字符串

没有 .htaccess 的 Mod 重写

其他解决方案,而不是 NGINX 的 .htaccess