【问题标题】:Load file if not exists in path如果路径中不存在则加载文件
【发布时间】:2015-05-17 10:04:01
【问题描述】:

我想为 WordPress 创建 css minify。缩小的文件将保存在 wp-content/cache 和宽度 .min.css - 例如:wp-content/cache/themes/twentyfifteen/style.min.css

我想从以下位置更改样式网址: www.example.com/wp-content/themes/twentyfifteen/style.css 到 www.example.com/wp-content/themes/twentyfifteen/style.min.css

但我不知道如何编写 htaccess 规则。 Htaccess 规则应该检查该文件 wp-content/themes/twentyfifteen/style.min.css 是否存在。如果文件存在则加载文件,如果不存在则从 wp-content/cache/themes/twentyfifteen/style.min.css

加载文件

我的代码:

 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteRule ^.*\.min.css$ /www-content/cache/$1.min.css [L]

这行不通

【问题讨论】:

  • 您显示的代码将不存在的文件 (-f) 和不存在的目录/文件夹 (-d) 重定向到目标 - 在您的情况下,是一个 .css 文件......您误解了如何。 htaccess 工作

标签: .htaccess


【解决方案1】:

你可以使用这条规则:

# if current file doesn't exist
RewriteCond %{REQUEST_FILENAME} !-f
# check presence of min.css in cache dir
RewriteCond %{DOCUMENT_ROOT}/$1/cache/$2 -f [NC]
RewriteRule ^(wp-content)/(themes/[^/]+/.+?\.min.css)$ /$1/cache/$2 [L,NC,R=302]

【讨论】:

  • 你在浏览器中输入了什么网址?
  • 嗯,没有。如果文件存在于 wp-content/themes/twentyfifteen/style.min.css 位置,则在浏览器中转到 www.example.com/wp-content/themes/twentyfifteen/style.min.css 然后加载此文件。如果不存在,则检查 wp-content/**cache**/themes/twentyfifteen/ 中是否存在并加载此文件
  • 但你写道:www.example.com/wp-content/themes/twentyfifteen/style.cssstyle. 之后没有min
  • 将更新规则用作RewriteBase 行下方的第一条规则。
【解决方案2】:

这不是 .htaccess 问题...

.htaccess 会根据您请求的文件为您进行各种重定向,但在您将请求放入 WordPress 流程之前,它永远不会请求它...

由于您使用的是 WordPress,这将有效(我在我的 WordPress 安装上测试过):

function load_minify() {
    foreach( array( 'wp-content', 'wp-content/cache' ) as $dir )
    {
        $fpath = $dir . '/themes/twentyfifteen/style.min.css';
        $froot = $_SERVER['DOCUMENT_ROOT'];
        if ( is_file( $froot . '/' . $fpath ) ) : ?>
    <link rel="stylesheet" type="text/css" media="all" href="<?php echo get_bloginfo( 'url' ) . '/' . $fpath; ?>" />
    <?php
        break;
        endif;
    }
}
add_action( 'wp_head', 'load_minify' );

将此添加到您的父或子functions.php 文件中的任何位置

已编辑先检查主题文件夹

【讨论】:

  • 如果在 style.min.css 中将是背景是问题:url(../images/test.jpg);
  • 从样式表到其他资源的路径是相对于样式表本身的。所以是的,如果有一个图像的相对 URL,并且该图像没有在缓存中复制,它将被破坏。但是如果样式表定义了一个绝对的图像 URL,它就不会被破坏。这就是为什么我从不在样式表、javascript 等中使用相对 URL,但 OP 的问题是如何从它们或缓存中包含样式表文件。
  • 是的,这是个问题。所以我的想法是使用相同的 url 到 css 并将文件名从 style.css 更改为 style.min.css 并使用 htaccess 检查和加载文件
  • 好的,然后就可以了——使用上面的代码将请求放入循环中,然后使用 .htaccess 重定向到样式表请求的损坏的 URL。如果没有request,.htaccess 将无法帮助您——您必须能够以某种方式发起请求。 (如果你还没弄清楚我在这里检查的嵌套时间,我会提供更多细节。不过我现在必须走了)
猜你喜欢
  • 2022-11-27
  • 1970-01-01
  • 2014-08-23
  • 1970-01-01
  • 2022-12-20
  • 1970-01-01
  • 2017-09-25
  • 2020-06-05
  • 2015-02-19
相关资源
最近更新 更多