超过 1000 个 301 重定向会降低我的网站速度吗?

Will over 1000 301 redirects slow down my site?

我已经更新了我的站点链接以使用漂亮的 URL 而不是查询字符串。

Old URL: https://digimoncard.io/deck/?deckid=1241
New URL: https://digimoncard.io/deck/green-otk-1241

这两个 URL 都可以在没有 404 的情况下访问,但我计划像这样向我的 htaccess 添加 301 重定向:

RewriteEngine on
Redirect 301 https://digimoncard.io/deck/?deckid=1241 https://digimoncard.io/deck/green-otk-1241

我担心的部分问题是所需的重定向数量(正好是 1218)。由于必须在每次页面加载时查询其中的每一个,这是否会降低 site/server 的速度?

我的另一个解决方案是可能不理会它,让 google 索引新的 URL 和超时让查询字符串过时。

好吧,它可能会变慢,但不一定。如果您的 .htaccess 不包含 10k 或更多重定向,应该没问题。但在预防方面,您始终可以使用较小的文件并删除不必要的重定向并让 google 为 URL 编制索引。

您可以参考此link了解更多信息
https://www.matthewedgar.net/do-redirects-add-to-website-speed/#htaccessredirectsspeed

.htaccess 中的 1218 重定向指令不应导致 noticeable/significant 延迟,但是您的建议还有其他问题,这可以大大优化以避免任何额外开销...

...having to query each of these on every page load?

不仅仅是“每个页面加载”,而且可能 每个请求。所有静态资源(CSS、JS、图像等)都将触发同一组指令(除非它们远离应用程序服务器托管)。

RewriteEngine on
Redirect 301 https://digimoncard.io/deck/?deckid=1241 https://digimoncard.io/deck/green-otk-1241

这行不通。 mod_alias Redirect 指令只匹配 URL 路径,它不匹配查询字符串(或方案+主机名),所以上面的指令将简单地匹配失败并且什么都不做。 (RewriteEngine 也是 mod_rewrite 的一部分,而不是 mod_alias。)

为了匹配查询字符串,您需要使用 mod_rewrite 和额外的 条件 来检查 QUERY_STRING 服务器变量。例如:

RewriteCond %{QUERY_STRING} ^deckid=(1241)$
RewriteRule ^deck/$ /green-otk-%1 [R=301,L]

%1 反向引用包含 1241(从前面的 CondPattern 中捕获)——这只是避免了重复(可能会引入错误)。当然,除非您自动生成这些指令。


不要使用 .htaccess - 请改用您的应用程序逻辑

但是,理想情况下,您一开始就不会在 .htaccess 中进行这些重定向。在您的应用程序逻辑中执行这些操作要好得多(理想情况下,当您的站点确定结果会触发 404 时——尽管在您的情况下不会发生这种情况)。通过将这些指令放在 .htaccess 中,您将以牺牲正常站点流量为代价来确定“重定向”的优先级。通过实施这些重定向 later(在您的应用程序中),您可以优先考虑正常的网站流量。

因为我假设您正在使用前端控制器来路由您的 URL,所以这应该相对容易实现。 (您仅在收到与旧 URL 格式匹配的请求时才处理重定向逻辑。)


优化的 .htaccess 版本

但是,如果您决定走 .htaccess 路线,如果您所有的旧 URL 都遵循相同的格式,那么您可以极大地优化它...您可以在内部重写任何使用该格式的请求/deck/?deckid=<number> 到一个子目录(假设你所有的旧 URL 都使用这种格式)。然后,您在处理所有 1218 重定向的子目录中有另一个 .htaccess 文件。这样,您的主 .htaccess 文件中只有一个指令,每个请求都会处理该指令,并且仅在需要时才处理重定向逻辑(在子目录 .htaccess 文件中)。

这避免了在 .htaccess 主文件中包含 1000 多个重定向指令的开销。

子目录 .htaccess 文件中的指令也可以简化,因为我们可以重写将查询字符串移动到 URL 路径的请求,以避免额外的 条件 稍后。

例如,在根 .htaccess 文件的顶部:

RewriteEngine On

# Internally rewrite the request for (what looks like) an old URL
# ...to the "/redirect-old" subdirectory
RewriteCond %{QUERY_STRING} ^deckid=(\d+)$
RewriteRule ^deck/$ redirect-old/%1 [L]

/deck/?deckid=<number> 形式的所有 URL 都在内部重写为 /redirect-old/<number>...

然后,在 /redirect-old/.htaccess 中,您有 简化的 “重定向”指令,如下所示,与 rewritten URL:

# /redirect-old/.htaccess

RewriteEngine On

# Redirect old URLs
RewriteRule ^1241$ /deck/green-otk-[=13=] [R=301,L]
RewriteRule ^1234$ /deck/foo-[=13=] [R=301,L]
RewriteRule ^4321$ /deck/bar-[=13=] [R=301,L]
:

这些指令与重写的 URL 匹配,即。 /redirect-old/<number> 并相应地重定向。

在每种情况下,[=35=] 反向引用只是与 RewriteRule 匹配的 URL-路径(即 number模式。 (保存重复 - 如上所述。)