如何重定向(htaccess)目录中的所有 URL?

Posted

技术标签:

【中文标题】如何重定向(htaccess)目录中的所有 URL?【英文标题】:How to redirect (htaccess) all URLs from within a directory? 【发布时间】:2021-08-08 06:53:19 【问题描述】:

我有这个当前的场景

Redirect 301 /linux-distros/link-a/ https://www.example.com/
Redirect 301 /linux-distros/link-b/ https://www.example.com/
Redirect 301 /linux-distros/link-c/ https://www.example.com/

但肯定更好的方法是为该目录中的所有 URL 做一个通配符?

我在想类似的东西会起作用,但奇怪的是它没有......

知道为什么吗?

RewriteRule ^linux-distros/(.*)$ /$1 [R=301,NC,L]

事实上!

我得到了这个工作,应该没问题吧?

我的意思是它运作良好,所以我想一切都很好,但是为了良好的秩序,这有什么问题吗:

RedirectMatch 301 ^/linux-distros/ https://www.example.com/

【问题讨论】:

【参考方案1】:

让我们在这里了解这两种规则之间的区别:

第一种:当我们使用RewriteRule时,规则如下:

RewriteEngine ON
RewriteRule ^linux-distros/(.*)$ /$1 [R=301,NC,L]

现在,当我在本地主机上使用 curl 命令(您也可以在浏览器中检查,我正在检查 Linux 终端)时,我在输出中得到以下信息:

curl -IL "http://localhost:80/linux-distros/link-a/"
HTTP/1.1 301 Moved Permanently
Location: http://localhost/link-a/

我们可以清楚地看到它的 URL 指向 localhost/link-a,因为您将 $1 传递给它,这是对规则左侧匹配正则表达式部分的反向引用。我相信你不想拥有它。

第 2 种类型: 现在让我们使用规则 RedirectMatch 301 ^/linux-distros/(.*)$ https://www.example.com/ 并在 curl 命令中尝试相同的 URL(http://localhost:80/linux-distros/link-a):

curl -IL "http://localhost:80/linux-distros/link-a/"
HTTP/1.1 301 Moved Permanently
Location: https://localhost/

我们可以清楚地看到它只转到没有链接-a 值的本地主机,这正是您正在寻找的,所以恕我直言,使用 RedirectMatch 将更适合这里。或者,如果您想使用RewriteRule,那么您可以使用类似:

RewriteEngine ON
RewriteRule ^linux-distros/.*$ http://%HTTP_HOST [R=301,NC,L]

注意:我也希望这些规则重定向到您网站的基本 URI/URL,因此您已经照顾好您的前端控制器端(我表示它将如何从后端等提供服务)。

【讨论】:

以上是关于如何重定向(htaccess)目录中的所有 URL?的主要内容,如果未能解决你的问题,请参考以下文章

将所有子目录页面重定向到 .htaccess 中的新域主页

如何仅使用 .htaccess 将所有 url 重定向到 1 个 url

htaccess如何将子目录重定向到外部URL

.htaccess:将根URL重定向到子目录,但保留根URL

如何使用 htaccess 将非 www 重定向到 www URL?

Htaccess 将所有文件从一个域中的子目录重定向到另一个域