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

标签 regex apache .htaccess mod-rewrite

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

v_3099_0726dd5b5e8dd67a214c0c243436d131_all.css

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

v_5028_0726dd5b5e8dd67a214c0c243436d131_all.css

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

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

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

对于如何实现顶部所述的目标有什么想法吗?谢谢。

最佳答案

我想不出一种方法可以单独在 .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]

关于regex - 重定向到文件名部分已知/部分未知的 CSS/JS 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56379699/

相关文章:

php - XDebug 探查器不在 apache 中写入文件

php - 使用 php 从数据库创建页面 [就像框架或 cms 正在做的那样]

.htaccess 删除其中一个 GET 值并重定向

python - 通过正则表达式匹配将字符串拆分为单独的列表

javascript - 在 PEG.js 中测试所有替代模式

regex - hive 找到最后一次出现

apache - 为浏览器缓存启用 mod_expires

Javascript 全名正则表达式问题

php - 为什么 PHP 刷新并不总是有效,页面 1/5 次未正确加载?

delphi - Indy "Could not load SSL Library"与 Delphi 2007/Apache