【问题标题】:redirect to CSS/JS files with partially known / partially unknown file names重定向到具有部分已知/部分未知文件名的 CSS/JS 文件
【发布时间】:2019-05-30 13:55:25
【问题描述】:

尝试使用 htaccess 将 Googlebot 重定向到来自这种形式的传入 URL 文件请求:

v_3099_0726dd5b5e8dd67a214c0c243436d131_all.css

到此格式的文件,其中5028 的四位数字未知,但始终为四位数字。

v_5028_0726dd5b5e8dd67a214c0c243436d131_all.css

我认为这对于正则表达式是不可能的,因为这四个字符的 catchcall 正则表达式不能在目标路径中使用。换句话说,Rewrite 不能被告知“去目录____中查找一个文件名,该文件名与除了这四个字符之外的所有内容都匹配,并将它们与正则表达式匹配。”

在 RewriteCond 中,正则表达式的模式匹配仅在右侧可用,在 CondPattern 中,而不是在左侧(测试字符串),在那里人们可能错误地希望使用正则表达式来匹配文件名带有 -f 标志的服务器,然后在 RewriteRule 的反向引用中使用该正则表达式分组来实现目标。这种策略行不通。

在 RewriteRule 中,与正则表达式的模式匹配仅在左侧可用,在传入 URL 的 Pattern 中,因此不能在右侧使用说,“去看看目录____除了这四个未知数字之外的相同文件,并重定向到该文件。”这种策略也行不通。

任何想法如何实现顶部所述的目标?谢谢。

【问题讨论】:

  • "到这种形式的文件,其中5028 的四位数字未知" - 那么,您如何确定要重定向到哪个文件? (为什么只有 Googlebot?)
  • 这就是我想要完成的工作——弄清楚当 Googlebot 请求那个过时的文件名时,我如何将 Googlebot 发送到当前文件。除了这四个字符之外,它的名字都是一样的。 Googlebot,因为我不希望它在搜索过时的 CSS/JS 文件时出现 404。

标签: regex apache .htaccess mod-rewrite


【解决方案1】:

我想不出单独在.htaccess 中执行此操作的方法。您要重定向/重写的文件必须是“已知的”。我无法看到(在.htaccess 中)扫描特定目录以查找与特定模式匹配的文件并返回(无需外部脚本的帮助)。

旁白: MultiViews 允许提供具有本质上未知扩展名的文件 - 但这里不是这种情况。)

在重定向/重写到其中一个文件之前,您可以潜在地“测试”各种文件的存在,但使用看起来像“随机”的 4 位数字 - 效率极低。

但是,您可以在内部将对此类文件(不存在)的请求重写为服务器端脚本(例如 PHP)。然后,此脚本检查“当前”文件并重定向或返回此文件将是微不足道的(假设只有 1 个文件应与此模式匹配)。

.htaccess 部分类似于:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^v_\d{4}_[0-9a-f]{32}_all\.css$ return-current-file.php [L]

【讨论】:

  • 谢谢你,怀特先生。这将在你的情况下工作。不过,我将不得不放弃以这种方式处理它,原因有两个:1. 有几个相同形式的过时文件和 2. 有时尚未创建带有四个新数字的“新”文件,在googlebot 来寻找旧的时间。在定期清除 CSS/JS 后,当普通访问者访问相关网页时,会创建新版本。我决定通过抛出 410 来处理它,但是我的 request_uri 不匹配有点挣扎。我将在此处发布问题链接,因为这是一个不同的问题。
  • 这里是我提到的follow-up question。如果我可以让 request-uri 匹配,我将为少数这样的页面抛出 410。
  • MrWhite,我已尽力解决以下问题。 - 吉姆
  • "1. 有几个相同形式的过时文件" - 您需要根据请求的文件确定“新”文件名的逻辑。 “2. 有时尚未创建带有四个新数字的“新”文件” - 在这种情况下,您别无选择,只能返回 404(或 410)。
【解决方案2】:

我无法确定为什么服务器配置或站点代码会强制 htaccess 中的“410 Gone”响应指令被 404 响应覆盖,因此必须执行类似 this 之类的操作来告诉 googlebot 停止搜索 CSS/定期清除(并在重新生成时重命名)的 JS 文件。

在 .htaccess 中:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule v_(.*)_(.*)$ /410response.php [L]

在 410response.php 中放置在根目录下:

<?php header($_SERVER['SERVER_PROTOCOL'].' 410 Gone');

更新我

尝试将 htaccess 用于 410 指令时的 404 响应是由服务器强制执行的,因为服务器显然有一个自定义 410 文档,该文档显然路由到 404。添加一个指令以防止随后正确允许使用 htaccess为 RewriteRule 中的模式匹配返回 410。 (我以为我昨天已经检查过这是否可行,因为@MrWhite 在上面的回答中说要控制服务器可能具有自定义 410;今天进行此检查时,它确实有效并表明服务器 410-to -404 重定向覆盖了我的 410 指令。)

ErrorDocument 410 default
RewriteRule test\.txt$ - [NC,R=410]

怀特先生!我在 Stack Exchange 上的 one of your posts 中找到了这个解决方案。

【讨论】:

  • 再次感谢您的反馈。但是,我原以为 404 对于这些不存在的 CSS 和 JS 文件就足够了——我不确定 410 在这里有什么好处? 410(相对于 404)可以帮助更快地从搜索结果中删除页面 URL,但是,这通常不是 CSS 和 JS 文件的问题。
  • 正确,我不知道它是否对 SEO 很重要。似乎 googlebot 从几个月甚至几年前开始继续检查 css 和 js。它遇到的 404 似乎并没有阻止它检查和重新检查和重新检查。所以,注意到这就是导致这一切的原因,然后我遇到了让事情复杂化的奇怪的 410 行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-16
  • 1970-01-01
相关资源
最近更新 更多