【问题标题】:Will over 1000 301 redirects slow down my site? [closed]超过 1000 301 次重定向会减慢我的网站速度吗? [关闭]
【发布时间】:2021-08-25 10:28:22
【问题描述】:

我已经更新了我的站点链接以使用漂亮的 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)。由于必须在每次页面加载时查询其中的每一个,这是否会降低站点/服务器的速度?

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

【问题讨论】:

  • 我以“基于意见”的方式投票结束 - 我的感觉是你在问“它会减慢 我在乎的程度吗?”我们无法帮助您。您必须衡量它是否以及多少会减慢您的速度,并确定它是否可以接受。 必须平衡重定向的价值和速度影响的成本(如果有的话)
  • 也许还可以查看httpd.apache.org/docs/2.4/rewrite/rewritemap.html(特别是dbm: DBM Hash File

标签: apache .htaccess redirect


【解决方案1】:

.htaccess 中的 1218 重定向指令不应导致明显/显着延迟,但是您的建议还有其他问题,可以对此进行极大优化以避免任何额外开销...

...必须在每次页面加载时查询其中的每一个?

不仅仅是“每个页面加载”,还可能是每个请求。所有静态资源(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 中,您会优先考虑“重定向”,但会牺牲正常的网站流量。通过稍后(在您的应用程序中)实施这些重定向,您可以优先考虑正常的网站流量。

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


优化 .htaccess 版本

但是,如果您决定使用 .htaccess 路由,如果您的所有旧 URL 都遵循相同的格式,那么您可以大大优化这一点……您可以在内部将任何使用格式 /deck/?deckid=<number> 的请求重写到子目录(假设所有您的旧网址使用这种格式)。然后,您在处理所有 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 中,您有简化“重定向”指令,如下所示,与 重写 URL 相匹配:

# /redirect-old/.htaccess

RewriteEngine On

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

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

每种情况下的$0 反向引用只是与RewriteRule 模式 匹配的URL 路径(即数字)。 (节省重复 - 如上所述。)

【讨论】:

  • 在我的 PHP 应用程序逻辑中执行它实际上更有意义(我真的忽略了这一点)并且现在实现了没有任何可察觉的减速。我也测试了优化的 .htaccess 版本,它也运行良好。谢谢!
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2012-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多