背景
我正在通过创建一个静态缓存来优化一些高流量页面。由于内容不经常更改,生成缓存并使其失效的机制非常简单。不过,目前我正在通过PHP (基本file_exists()检查)访问缓存。我想把它提升到web服务器级别,以完全删除PHP。
等级库
我会有成千上万的缓存页面。所以我设想的目录树是:
year -> first id of digit -> second id of digit -> id.html我用这种方式将它分开,以避免单个目录中有10个文件--据我所知,这是一个性能上的问题。我熟悉mod_rewrite,但不太确定如何捕获必要的URL片段并确定文件是否存在。
下面是一个传入URL的示例:
/2011/37823/some_slug一些伪代码,使用上面的URL:
RewriteCond %{REQUEST_URL} ^(\d{4})/...
RewriteCond /cache/$1/$3/$4/$2.html -f
RewriteRule - /cache/$1/$3/$4/$2.html [L]问题
RewriteRule?发布于 2012-03-02 19:53:14
这将需要调整,因为regex与您所列出的模式不匹配(顺序更改),但是下面的内容基于您的示例URL:
RewriteCond %{DOCUMENT_ROOT}/cache/$1$2$3\.html -f
RewriteRule ^(\d+)(/\d+)(/[^/]+)$ /cache/$1$2$3.html [L]如果您想要更多嵌套(基于‘d的第一位和第二位的文件夹,但忽略URL中间部分的其余部分),则如下所示:
RewriteCond %{DOCUMENT_ROOT}/cache/$1$2/$3$4\.html -f
RewriteRule ^(\d+)(/\d)(\d)\d*(/[^/]+)$ /cache/$1$2/$3$4.html [L]首先检查RewriteRule以查看规则是否适用。然后,RewriteCond使用来自RewriteRule的捕获来检查文件存在(DOCUMENT_ROOT是站点根)。如果存在这种情况,则满足条件,RewriteRule重写[L],在停止重写[L]之前为缓存的页面提供服务。
就更好的选项而言,这比您拥有的PHP更好,因为它不会为缓存的页面启动PHP。但是,它将检查每个资源请求的模式。
发布于 2012-03-02 20:23:05
我认为,这应该适用于你:
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/(\d{4})\/((\d)(\d)\d+)
RewriteCond %{DOCUMENT_ROOT}/cache/%1/%3/%4/%2.html -f
RewriteRule ^.* /cache/%1/%3/%4/%2.html [L,QSA]第一个条件匹配/(年份)/((Digit1)(Digit2)Digit3-to-n).parantheses告诉系统将内部的值存储到变量%1-%4。请注意其中有副项的棘手部分。似乎regexp从开始/打开就开始计算顺序,所以id周围的外部(是%2,然后digit1是%3等等。
第二个条件检查完整的文件路径。DOCUMENT_ROOT为您提供了本地文件系统路径。请注意,我使用的是%而不是$。这是因为我使用的是来自上一个行的存储变量,而不是当前。
RewriteRule只是将所有内容重写到您的新路径。L告诉apache停止寻找更多的重写,QSA在重写之后将查询字符串放回(不确定是否需要重写)。
https://stackoverflow.com/questions/9539325
复制相似问题