【问题标题】:.htaccess rewrite root folder to subfolder.htaccess 将根文件夹重写为子文件夹
【发布时间】:2021-11-20 00:59:11
【问题描述】:

请我帮忙将 URL 重定向到子文件夹,以便将 https://example.com 中的所有内容重写为 https://example.co.uk/subfolder

.htaccess 文件需要在/subfolder 中。

【问题讨论】:

  • site1.co.uksite.co.uk 的不同域是否重要?或者这应该是同一个主机? /subfolder 中是否还有另一个 .htaccess 文件?如果有,里面有什么内容?
  • 对不起,他们都应该说 site1.co.uk。 .htaccess 位于子文件夹中。我已经编辑了问题以反映。
  • 我已经更新了关于“.htaccess 文件需要位于 /subfolder 中”的更新的答案。 - 如果是这种情况,那么您的要求是不可能的。为了将请求从根目录重写到子文件夹,.htaccess 文件必须位于根目录中。

标签: .htaccess redirect url-rewriting


【解决方案1】:

MrWhite 已经给出了我应该附在我的答案中的几乎所有解释。因此,就像他在回答中已经说过的那样,下面给出的 指令 应该写入位于 https://site1.co.uk 指向的文件夹中的 .htaccess 文件中,以使其按预期工作。

以下是您可以使用的指令。

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.+)$ /subfolder/$1 [QSA,L]
</IfModule>

第一个RewriteCond 将有助于确保请求不是针对.htaccess 文件所在文件夹中已存在的文件。

第二行RewriteCond 与第一行类似,但它会检查文件夹。在此行之后,您可以并且可能应该从MrWhite's answer 添加REDIRECT_STATUS 行。请参阅他的答案以获取解释。

RewriteRule 行使用正则表达式 (RegEx) 来实现重写。请记住将此行上的 subfolder 替换为您希望使用的文件夹的名称,并且该文件夹应与 .htaccess 文件所在的位置相同,并且就像已经解释的那样,这必须是 https://site1.co.uk 指向的文件夹到。

希望这会有所帮助。

【讨论】:

  • 欢迎。您可以编辑答案以提供更多详细信息吗?请查看针对此问题提供的其他答案,作为 Stack Overflow 上预期的详细程度的一个很好的例子。
  • 这个解决方案实际上存在一些问题(解释的原因更多,这可能有助于突出问题)......如果子文件夹中没有额外的.htaccess文件包含 mod_rewrite 指令(未在问题中说明)并且重写的请求未映射到文件(或目录),那么这将导致重写循环(500 错误)。这也不会重写对根目录本身的请求。
  • 谢谢Jeremy Caney。我已经更新了我的答案。
【解决方案2】:

您可以在根 .htaccess 文件中执行类似以下操作,以重写对子文件夹的所有直接请求。

RewriteEngine On

# Rewrite all direct requests to the `/subfolder` directory
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^ subfolder%{REQUEST_URI} [L]

REDIRECT_STATUS 环境变量的检查确保只有来自客户端的直接请求(与内部重写的请求相反)被重写到/subfolder 目录(从而避免了重写循环)。

这也意味着对/subfolder 本身的直接请求也将被重写到/subfolder 目录(即/subfolder/subfolder) - 因此,如果您愿意,您可以拥有一个同名的子文件夹(否则对/subfolder 的直接请求将导致 404)。也就是说,除非您在子文件夹中有一个额外的 .htaccess 文件,该文件还包含 mod_rewrite 指令,在这种情况下,这些指令将被覆盖。


更新:根据您的问题更新,现在声明如下...

.htaccess 文件需要在/subfolder 中。

在这种情况下,这是不可能的。将请求重写为/subfolder.htaccess 文件必须位于文档根目录(父目录)中。

如果.htaccess 文件位于/subfolder 本身中,那么它将永远不会针对该子文件夹之外的请求进行处理以重写请求。

【讨论】:

    猜你喜欢
    • 2014-01-13
    • 1970-01-01
    • 2011-09-13
    • 2019-12-21
    • 2015-11-11
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多