0

我正在尝试解决我当前共享主机配置的一些烦恼,但是在按照我的意愿设置所有内容时遇到了一些问题。

目前,我有以下文件夹结构:

/
/.htaccess
  /example
  /example1
  /example2
  /example3

在共享主机上,主域自动设置为指向根目录。为了将主域指向子域,我在根文件的 .htaccess 中添加了以下内容:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L]

RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$
RewriteCond %{REQUEST_URI} !^/example/
#RewriteCond %{REQUEST_FILENAME} !-f
#RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /example/$1
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteRule ^(/)?$ example/ [L]

这会正确地重写 URL,以便转到 example.com 显示 /example/ 子目录中的内容。问题是根目录的子目录没有以相同的方式重写,这不是我希望实现的功能。例子:

http://www.example.com/            = /example
http://www.example.com/example/    = /example
http://www.example.com/example1/   = /example1
http://www.example.com/example2/   = /example2
http://www.example.com/example3/   = /example3

我想要发生的是以下情况:

http://www.example.com/            = /example
http://www.example.com/example/    = /example/example
http://www.example.com/example1/   = /example/example1
http://www.example.com/example2/   = /example/example2
http://www.example.com/example3/   = /example/example3

我对应该发生的事情的理解如下:

  1. 收到对http://www.example.com的请求。
  2. 第一个条件不匹配,HTTP_HOST 不匹配 ^example.com$
  3. 第二个条件:匹配 ^www.example.com
  4. 第三个条件:没有 REQUEST_URI,所以它不匹配 ^/example/
  5. 第四和第五:我试过有和没有这些,但似乎并没有改变结果。我的理解是,如果未注释这些行,我会在我现在拥有之前看到不需要的内容(如果文件名和目录存在,则不会进行重写)。
  6. 将请求重写到 example.com/example/
  7. 第六个条件:将 URL 与特定域匹配。
  8. 始终重写以使用该 URL 的 /example/ 子目录。

这似乎确实有效,但如果我尝试访问http://www.example.com/example2/,我就会遇到问题。由于 REQUEST_URI 不匹配 /example/,我的想法是它应该重写到 /example/example2,但这显然不会发生。

我无权访问 Apache 配置或设置 VirtualHosts 的能力,所以我希望有某种方法可以使用 .htaccess 规则来做到这一点。任何关于我如何使这个简单任务过于复杂的见解都会非常有帮助。

4

1 回答 1

0

据我所知,如果根目录中的目录与传入的请求匹配(即,如果根目录中存在 example1,则将 RewriteCond 重写为 /example1 将忽略根目录中的 .htaccess 文件从未触发错误页面)。

我对此的解决方案最终没有我希望的那么优雅,但它似乎正在工作。希望它可以帮助任何偶然发现这个问题的人。

在 example1、example2 和 example3 目录中,我修改了 .htaccess 文件以包含以下内容(根据目录更改 example1):

RewriteCond %{HTTP_HOST} ^(www\.)example\.com$ [NC]
RewriteRule ^(.*)$ /example/example1/$1 [L]

这会强制主域提供我为其创建的子目录中的内容,即使根目录中有匹配的目录。

于 2012-08-05T00:16:59.157 回答