.htaccess 文件中的子域仅适用于索引

Subdomain in .htaccess file only works with index

我的 .htaccess 中有一个子域设置,它似乎只适用于默认的 index.html 页面。我希望它适用于与子域对应的文件夹中的任何页面。为保护隐私而编辑,假设我的域是 example.org。文件的相关部分如下所示...

#subdomain 
RewriteCond %{HTTP_HOST} ^subname\.example\.org$ [OR]
RewriteCond %{HTTP_HOST} ^www\.subname\.example\.org$
# (a few lines added by my hosting company deleted -- see below)
RewriteRule ^/?$ "http\:\/\/example\.org\/subname\/" [R=301,L]

所以上面的结果是,如果我的 'public-html'(root?)中有一个 index.html 页面,http://example.org 和一个不同的 index.html 存储在一个子文件夹(与子域同名),我将得到这个预期的结果,这是有效的...

浏览到:http://example.org 结果查看 http:// example.org/index.html
浏览至:http://subname.example.org 结果查看 http:// example.org/subname/index.html

到目前为止还不错。这是我在创建域名时所期望的。但是,鉴于 myfile.html 存储在 subname 文件夹中的特定文件,我希望它也能工作,但它不...

浏览到:http://subname.example.org/myfile.html 导致 404 错误。

尽管浏览到 http://example.org/subname/myfile.html 工作正常。在这种情况下,会显示 myfile.html。那么我可以做些什么来修改子域代码以获得我正在寻找的结果吗?也就是说,无论 'ANYFILE' 是什么,浏览 http://subname.example.org/ANYFILE 应该和浏览 http://example.org/subname/ANYFILE 一样有效。毕竟,这是我设置子域的主要原因之一!

注意:我承认我依赖托管公司的 cPanel 实用程序来创建子域代码,所以我首先向他们的技术支持寻求帮助。长话短说他们没有。也许我所希望的实际上是不可能的?

此外,我从代码中删除的行与我的托管公司在某个时候添加的名为“well-known/acme-challenge”的内容有关。由于删除它们对我描述的行为没有影响,我将其省略以避免混淆问题。

RewriteRule ^/?$ "http\:\/\/example\.org\/subname\/" [R=301,L]

这只会“重定向”文档根目录。要重定向所有 URL,您需要将上面的内容更改为如下内容:

RewriteRule (.*) http://example.org/subname/ [R=301,L]

</code> 反向引用指的是在 <code>RewriteRule 模式 中捕获的 URL-path,即。 (.*).

无需 backslash-escape 替换 字符串中的冒号、斜杠和点(这是 cPanel 的典型做法)。

Also, the lines I deleted' from the code had to do with something called "well-known/acme-challenge", added by my hosting company at some point.

(让我们加密?)SSL 证书 auto-renews 时可能需要这些行。 (尽管上面重定向到“http”——你没有使用 HTTPS 吗?)


更新:

RewriteCond %{HTTP_HOST} ^subname\.example\.org$ [OR]
RewriteCond %{HTTP_HOST} ^www\.subname\.example\.org$

顺便说一句,如果您愿意,可以将这两个条件简化为一个条件。例如,上面相当于:

RewriteCond %{HTTP_HOST} ^(www\.)?subname\.example\.org$