【问题标题】:Subdomain in .htaccess file only works with index.htaccess 文件中的子域仅适用于索引
【发布时间】:2020-09-11 21:36:52
【问题描述】:

我的.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”(根?)中有一个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

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

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

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

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

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

【问题讨论】:

  • .htaccess 全部小写。

标签: .htaccess subdomain


【解决方案1】:
RewriteRule ^/?$ "http\:\/\/example\.org\/subname\/" [R=301,L]

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

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

$1 反向引用指的是在RewriteRule 模式 中捕获的 URL 路径,即。 (.*).

substitution 字符串中的冒号、斜杠和点无需反斜杠转义(这是 cPanel 的典型特征)。

此外,我从代码中删除的行与我的托管公司在某个时候添加的所谓“知名/acme-challenge”有关。

当(让我们加密?)SSL 证书自动更新时,可能需要这些行。 (虽然上面重定向到“http” - 你没有使用 HTTPS 吗?)


更新:

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

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

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

【讨论】:

  • 是的,它是一个旧网站(还不是 https)。但无论如何,第一次感谢您澄清为什么添加了所有这些转义符。另外,请原谅我之前的评论(刚刚删除!)您的建议似乎有效!它似乎不会干扰访问文档根目录中的文件,domain/SOMEFILE。而且,正如希望的那样,现在可以使用HTTP://sub/domain/SOMEFILE 获取“域/子/”中的文件!我也会让你知道我已经回来和第四天获得了技术支持,但他们都不能帮助。可悲的是,我想如果不能通过 CPANEL 完成,不知道从哪里开始。再次感谢!
  • 另外,由于我还没有着手让我的网站使用 HTTPS,我不确定为什么要添加所有其他行。当我 DO 决定访问 https 时,这一切都让我对使用 CPANEL 持怀疑态度。但现在我可能不需要这些行,所以我保存了旧的 htaccess,并将它们排除在固定版本之外。再次感谢!
  • 不客气。是的,托管支持通常不会处理.htaccess 查询。 (尽管有时只有网络主机知道在某些情况下使用的正确指令。)网络主机可能默认启用了 SSL 证书(向“HTTPS 无处不在”的驱动器),此时那些 条件 i> 在每个 RewriteRule 指令之前(令人讨厌地)注入。有关更多信息,请参阅my answer 至以下ServerFault question
  • 再次感谢,实际上我可能不需要我的 REWRITECOND 中的第二行('OR' 条件),因为在此之前我很久以前添加了一条规则来从请求中删除“www” .在一个令人抓狂的调试冲刺发现当访问者在 WWW.MYDOMAIN 那里时设置的 JavaScript cookie 与从 MYDOMAIN 访问中设置的 cookie 不同,我这样做了。显然这种情况发生了很多,因为我去过的医疗网站找不到我的记录,除非我访问了 WWW!所以在没有 WWW 的情况下重写是我的解决方案。不过,我需要一本好的 .HTACCESS 指南!
  • 谢谢!我会调查的。 htaccess 是其中之一,与我更频繁的 javaScript 和 PHP 编码不同的是,它的使用频率不足以让我在没有一些指导的情况下成功地做任何事情。老实说,正则表达式仍然经常让我感到困惑。因此,我经常在没有 100% 理解的情况下粘贴解决方案,这是我讨厌做的事情。因此,我寻找 ELIF 解释,这是那些愚蠢的首字母缩略词之一,意思是“像我五岁一样解释”。我相信它始于一个使用该首字母缩略词的网站,邀请人们提出问题并轻松获得答案。 :-)
猜你喜欢
  • 1970-01-01
  • 2016-05-12
  • 1970-01-01
  • 2012-07-02
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 2014-12-09
  • 2020-01-07
相关资源
最近更新 更多