Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache htaccess-条件重写和过期_Apache_.htaccess_Url Rewriting_Cache Control_Mod Expires - Fatal编程技术网

Apache htaccess-条件重写和过期

Apache htaccess-条件重写和过期,apache,.htaccess,url-rewriting,cache-control,mod-expires,Apache,.htaccess,Url Rewriting,Cache Control,Mod Expires,嘿 我在Apache2.x服务器webroot中有一个文件夹/static。如果请求匹配 /static/<somename like [\S-_]+>.(png|jpg|css|js)/\d{8,15} 我想要两件事: url应重写为/static/bg.jpg(去掉时间戳) 它将成为一个('expires 2030,max age=290304000,公共缓存,…) 如果请求不匹配,则请求及其标头应正常,无需重写。理想情况下,任何在/static/*之外的请求都不应受到影响

我在Apache2.x服务器webroot中有一个文件夹
/static
。如果请求匹配

/static/<somename like [\S-_]+>.(png|jpg|css|js)/\d{8,15}
我想要两件事:

  • url应重写为
    /static/bg.jpg
    (去掉时间戳)
  • 它将成为一个('expires 2030,max age=290304000,公共缓存,…)
如果请求不匹配,则请求及其标头应正常,无需重写。理想情况下,任何在/static/*之外的请求都不应受到影响(尽管«巧合的尾随时间戳»应该很少…)

我在FilesMatch/RewriteCond上除了麻烦什么都没有,所以我宁愿不发布我糟糕的尝试。。。(在我的机器上启用了“在泛型中重写”,并且我确实拥有发送缓存相关标头的权限)


丹克什恩像这样的怎么样

RewriteEngine on
RewriteRule ^static/([^/]+\.(png|jpg|css|js))x?/\d{8,15}$ /static/$1 [NC,L]

<FilesMatch "\.(png|jpg|css|js)$">
    <IfModule mod_expires.c>
        ExpiresActive On
    </IfModule>
    <IfModule mod_headers.c>
        ExpiresDefault "access plus 10 years"
    </IfModule>
</FilesMatch>
重新编写引擎打开
重写规则^static/([^/]+\(png | jpg | css | js))x?/\d{8,15}$/static/$1[NC,L]
过期于
ExpiresDefault“访问权限加10年”
选项+以下符号链接-多视图
#打开mod_rewrite
重新启动发动机
重写基/
重写规则^static/([^.]+\(png | jpe?g | css | js))/\d{8,15}$static/$1[L,R,NC]
#现在将过期日期设置为今天+1年
过期于
过期按类型图像/jpeg“访问加1年”
过期按类型图像/png“访问加1年”
ExpiresByType文本/css“访问加1年”
ExpiresByType文本/js“访问加1年”
ExpiresByType文本/javascript“访问加1年”
ExpiresByType应用程序/javascript“访问加1年”
ExpiresByType应用程序/x-javascript“访问加1年”
我选择了
iccess+1年
for永不过期,因为我在网上发现了这一点:

要将响应标记为“永不过期”,源服务器将发送 截止日期约为收到响应后一年 HTTP/1.1服务器发送的过期日期不应超过一个 未来的一年。”

来自HTTP 1.1 RFC


非常感谢。我将查看并测试它。我请求你再耐心2-3天,没问题。很乐意帮忙。顺便说一下,这是测试htaccess规则的一个非常有用的工具-谢谢。您的解决方案,分别是您的两个解决方案。但有一件事似乎是不可能的:未重写的文件会定期过期,而只有重写的文件才会获得“永不过期”。FileMatch似乎只关心最终打开的文件,而不关心以前发生的任何事情。无论是置于重写规则之上还是之下。换句话说,所有JPG、PNG现在都成为永不过期。因此,即使我选择了
static/simple.jpgx/123456789
(这就是为什么我暂时停留在
x?
),它也会得到匹配。反过来说,在文件匹配中附加
/\d{8,15}
是没有用的(因为没有最终打开的文件匹配)。唯一的方法可能是将所有常规(非时间戳)文件重写到隧道ish
static/download.php?%1
。FileMatch不会捕捉到这一点(因为最终它是.php)。。。。。。或者教育性的
重写规则^static/([^/]+\(png | jpg | css | js))$/static/dontdothis.php?$1[NC,L]
:-)是的,您也可以添加
.gif
RewriteEngine on
RewriteRule ^static/([^/]+\.(png|jpg|css|js))x?/\d{8,15}$ /static/$1 [NC,L]

<FilesMatch "\.(png|jpg|css|js)$">
    <IfModule mod_expires.c>
        ExpiresActive On
    </IfModule>
    <IfModule mod_headers.c>
        ExpiresDefault "access plus 10 years"
    </IfModule>
</FilesMatch>
Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

RewriteRule ^static/([^.]+\.(png|jpe?g|css|js))/\d{8,15}$ static/$1 [L,R,NC]

# now set expire date to today + 1 year
<IfModule mod_expires.c>
    ExpiresActive on
    ExpiresByType image/jpeg "access plus 1 years"
    ExpiresByType image/png "access plus 1 years" 
    ExpiresByType text/css "access plus 1 years"
    ExpiresByType text/js "access plus 1 years"
    ExpiresByType text/javascript "access plus 1 years"
    ExpiresByType application/javascript "access plus 1 years"
    ExpiresByType application/x-javascript "access plus 1 years" 
</IfModule>