首页 > 解决方案 > 重定向到具有部分已知/部分未知文件名的 CSS/JS 文件

问题描述

尝试使用 htaccess 从这种形式的传入 URL 文件请求中重定向 Googlebot:

v_3099_0726dd5b5e8dd67a214c0c243436d131_all.css

到这种形式的文件,其中的四位数字5028未知,但始终是四位数字。

v_5028_0726dd5b5e8dd67a214c0c243436d131_all.css

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

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

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

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

标签: regexapache.htaccessmod-rewrite

解决方案


我无法确定为什么服务器配置或站点代码会强制 htaccess 中的“410 Gone”响应指令被 404 响应覆盖,因此必须执行类似的操作告诉 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 返回 410用于 RewriteRule 中的模式匹配。(我以为我昨天已经检查过这是否可行,因为@MrWhite 在上面的回答中说要控制服务器可能具有自定义 410;今天进行此检查时,它确实有效并指示服务器 410-to -404 重定向覆盖了我的 410 指令。)

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

白先生!我在您在 Stack Exchange 上的一篇帖子中找到了这个解决方案。


推荐阅读