使用 .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 503 重定向中保持网站网址相同