使用 .htaccess 重定向网站但排除一个文件夹

Posted

技术标签:

【中文标题】使用 .htaccess 重定向网站但排除一个文件夹【英文标题】:Redirect site with .htaccess but exclude one folder 【发布时间】:2011-03-25 17:58:04 【问题描述】:

我想 301 重定向整个网站,但排除 /root 目录中存在的名为 /uploads 的文件夹中的所有内容。

我在谷歌上搜索过,但没有找到任何结果,或者我认为我看到的内容不正确。

我们可以破解这个吗?

【问题讨论】:

【参考方案1】:

试试这个mod_rewrite 规则:

RewriteEngine on
RewriteRule !^uploads($|/) http://example.com%REQUEST_URI [L,R=301]

此规则匹配任何/uploads/uploads/ 开头的URL 路径(由于在. htaccess 文件)并将请求重定向到 example.com 的相应路径。

【讨论】:

是否有在后台执行此操作的选项,因此用户实际上不会被重定向,但所有请求都会被代理到另一个地址? @burninggramma 试试P 而不是R=301 @Gumbo 我得到了 403 禁止 谢谢。我将您的答案用于我自己复杂的要求***.com/a/35435802/80353【参考方案2】:

我自己偶然发现的简单答案。

在任何其他调用之前的顶部添加以下内容

RewriteRule ^(uploads) - [L]

【讨论】:

如果有人好奇 [L] 的作用:httpd.apache.org/docs/2.4/rewrite/flags.html#flag_l 这是一个不完整的答案。我使用了来自 mod_alias 的Redirect,这似乎不能一起工作。因此,请添加一些信息如何与将所有其他页面重定向到 另一个 域一起使用,因为许多其他人告诉我 mod_alias 不是进行域重定向的正确选择。 @ThomasTempelmann mod_alias 和 mod_rewrite 不能很好地配合使用。我不打算详细说明原因(因为它超出了这个问题的范围),但这里有一个指向另一个可能有帮助的问题的链接。 ***.com/a/808089/588005 这就是说以“uploads”开头的uri不应该改变,并且由于没有隐式设置重定向,它可能会导致重定向循环。为什么在这里使用大括号? 这会破坏“uploads_b”的重定向【参考方案3】:

我想你想要这个:

RewriteEngine on
RewriteCond %REQUEST_URI !^/uploads/
RewriteRule (.*) http://www.newdomain.com/$1 [R=301,L]

如果您收到 500 Internal Error,请仔细检查第二行的 ! 之间是否有空格。

【讨论】:

【参考方案4】:

基于模式别名的解决方案

重定向除特定文件夹之外的所有文件夹

将以下行添加到您的 root/.htaccess :

RedirectMatch 301 ^/((?!uploads).*)$ http://newdomain.com/$1

这会将所有页面(不包括 /uploads/*)从旧域重定向到新域。

【讨论】:

这很完美!非常有用,因为我无法使用 mod_rewrite,因为没有在客户的服务器上启用 这是我的虚拟http 主机的解决方案,其唯一目的是包含certbot certonly --webroot.well-known 目录(让我们加密):RedirectMatch permanent ^/((?!\.well-known)(/.*)?)$ https://%SERVER_NAME/$1 对于不使用 RewriteEngine 的情况,有这个解决方案很好;在也使用 RewriteRules 的(虚拟)主机中,最好使用RewriteCond 解决方案。

以上是关于使用 .htaccess 重定向网站但排除一个文件夹的主要内容,如果未能解决你的问题,请参考以下文章

htaccess 301重定向整个网站但有例外

具有排除条件的 301 重定向 (htaccess)

如何在 .htaccess 503 重定向中保持网站网址相同

访问。将排除的子文件夹重定向到域的 https 版本,其他所有内容都被重定向到另一个域

使用 htaccess 进行简单重定向

使用 .htaccess 文件后,从我网站上的一个页面重定向到另一个页面会导致 404 错误