如何使用 htaccess 从 URL 中删除子文件夹

How to remove a subfolder from URL using htaccess

我们有那些 URL:

https://www.example.com/public/something/something

我需要删除 /public/ 子文件夹,这样每个包含此子文件夹的重复项 URL 都将使用 301 重定向重定向到相同的 URL 但没有子文件夹。上面的示例将重定向到:

https://www.example.com/something/something

我试过这个:

RewriteRule ^public/(.*)$ / [L,NC,R=301]

示例仍然是 returns 200. 如何将每个带有 /public/ 的 URL 重定向到同一个没有子文件夹的 URL?如果可能的话,你能解释一下处理它的 .htacces 代码吗?

编辑:我们在服务器上发现了另一个隐藏的 .htaccess 文件,这似乎是我们需要设置的文件。这是它的内容:https://gist.github.com/zatkoma/6425eb2f93c3c6affd46828de044e95b.

我们已经在此处添加了该行,但仍然没有任何反应。我们到底应该把线放在哪里?

谢谢

您的配置有两个问题:第一个是在子文件夹 .htaccess 中时,RewriteRule pattern 将去除该子文件夹的路径 所以 ^public/ 永远不会匹配。
第二个更难一些:您要求您的网站位于 /public 子文件夹中,因此当用户输入 URL 而没有 /public 时,您(在 root htaccess 中)将其重写为 /public/...
但同时你想要,如果有人写 URL 以 /public/ 开头,你希望它被删除。
这可以通过检查原始请求(在浏览器中键入)是否包含 /public 来实现。 所以现在流程是:

  1. 检查请求是否有/public,如果没有则在内部添加,然后去 到 /public (由 htaccess 在 root 中完成)
  2. /public 时(因此子文件夹 .htaccess 有效),不要检查请求是否以 /public 开头(因为它总是这样),但检查是否是原始请求(在第 1 步之前)。有 /public,只有在有的情况下,才重写为 URL 没有 /public

    RewriteCond %{THE_REQUEST} \s/public/
    RewriteRule (.*) / [L,NC,R=301]