【问题标题】:Log image filename that's cached by external cdn using htaccess使用 htaccess 由外部 cdn 缓存的日志图像文件名
【发布时间】:2021-10-07 16:52:49
【问题描述】:

每当特定的 cdn 缓存我们的图像时,我想保留图像文件名的日志,但我无法完全理解。现在,我的代码看起来像:

RewriteCond %{HTTP_USER_AGENT} Photon/1.0
RewriteRule ^(.*)$ log.php?image=$1 [L]

上面总是将图像记录为“log.php”,即使我正在制作 cdn 缓存“example.jpg”并且我完全不明白为什么。

【问题讨论】:

    标签: apache .htaccess mod-rewrite


    【解决方案1】:

    上面总是将图像记录为“log.php”,即使我正在制作 cdn 缓存“example.jpg”并且我完全不明白为什么。

    因为在.htaccess 中,重写引擎循环直到 URL 不变(尽管存在 L 标志)并且您的规则也匹配 log.php(您的规则匹配所有内容) - 所以这是最终记录的“图像”。 L 标志只是停止当前 pass 通过重写引擎。

    例如:

    1. 请求/example.jpg
    2. 请求被重写为log.php?image=example.jpg
    3. 重写引擎重新开始,将/log.php?image=example.jpg 传递到第二遍的开头。
    4. 请求被相同的RewriteRule 指令重写为log.php?image=log.php
    5. 重写引擎重新开始,将/log.php?image=log.php 传递到第三遍的开头。
    6. 请求被重写为log.php?image=log.php(再次)。
    7. 在最后一次传递中 URL 未更改 - 处理停止。

    您需要创建一个异常以便log.php 本身不被处理。或者,声明所有非.php 文件都已处理(而不是所有)。或者,如果只处理图像,则只检查图像。

    例如:

    # Log images only
    RewriteCond %{HTTP_USER_AGENT} Photon/1\.0
    RewriteRule ^(.+\.(?:png|jpg|webp|gif))$ log.php?image=$1 [L]
    

    记得在正则表达式中使用反斜杠转义文字点。

    或者,

    # Log Everything except log.php itself
    RewriteCond %{HTTP_USER_AGENT} Photon/1\.0
    RewriteCond %{REQUEST_URI} ^/(.+)
    RewriteRule !^log\.php$ log.php?image=%1 [L]
    

    在最后一个示例中,%1 指的是前面 CondPattern 中捕获的子模式。我只是这样做,而不是直接使用REQUEST_URI,因为您在原始日志记录指令中排除了斜杠前缀(即,当请求/image.jpg 时,您将image.jpg 传递给您的脚本)。如果你也想记录斜线前缀,那么你可以省略第二个条件并直接传递REQUEST_URI。例如:

    # Log Everything except log.php itself (include slash prefix)
    RewriteCond %{HTTP_USER_AGENT} Photon/1.0
    RewriteRule !^log\.php$ log.php?image=%{REQUEST_URI} [L]
    

    或者,在 Apache 2.4+ 上,您可以使用 END 标志而不是 L 强制重写引擎停止并防止进一步通过重写引擎。例如:

    RewriteCond %{HTTP_USER_AGENT} Photon/1\.0
    RewriteRule (.+) log.php?image=$1 [END]
    

    【讨论】:

    • 太棒了!这很有意义。猜猜我以前从未遇到过类似的问题,因为幸运的是我的 htaccess 文件在此问题之前没有出现问题。我将其更改为“RewriteRule!^log.php$ log.php?image=%{REQUEST_URI}”,它运行良好。谢谢!
    • @user1413341 不客气。这种“循环”是“500 内部服务器错误”的常见原因——当它陷入无限循环时。 (默认情况下,服务器会在 10 次内部循环后停止,但会因错误而中断。)
    猜你喜欢
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    • 2016-08-20
    • 2011-04-09
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    相关资源
    最近更新 更多