重定向到具有部分已知/部分未知文件名的CSS / JS文件

时间:2019-05-30 13:55:26

标签: regex apache .htaccess mod-rewrite

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

v_3099_0726dd5b5e8dd67a214c0c243436d131_all.css

这种格式的文件,其中5028的四位数未知,但始终为四位数。

v_5028_0726dd5b5e8dd67a214c0c243436d131_all.css

我认为使用正则表达式是不可能的,因为这四个字符的catchatch正则表达式不能在目标路径中使用。换句话说,不能告诉Rewrite:“在目录____中查找一个文件名,该文件名与除这四个字符外的所有字面值匹配,并与正则表达式匹配。

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

在RewriteRule中,与regex匹配的模式仅在左侧,在传入URL的模式中可用,因此不能在右侧使用“在目录____中查找一个文件,除了这四个未知数字外,其他都相同,然后重定向到该文件。”这种策略也行不通。

有什么想法可以实现顶部列出的目标?谢谢。

2 个答案:

答案 0 :(得分:1)

我想不出一种单独使用.htaccess的方法。您要重定向/重写到的文件必须是“已知的”。在.htaccess中,我看不到要在特定目录中扫描与特定模式匹配的文件并返回该文件的方式(无需外部脚本的帮助)。

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

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

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

其中的.htaccess部分类似于:

RewriteEngine On

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

答案 1 :(得分:0)

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

.htaccess中的

id

放在410response.php中的根目录中:

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

更新我

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

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

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