.htaccess 如果文件存在,则通过apache/htaccess提供缓存,否则从数据库加载数据

jmo0nnb3  于 2022-11-16  发布在  Apache
关注(0)|答案(1)|浏览(154)

我发现了这个问题:

它很有用,但是我不能为我系统写代码。
这是我的URL结构:

www.example.com/typeOfPost/category/ID/permalink

(For示例:www.example.com/news/sport/8734/here-goes-article-title
我的缓存结构如下:

ROOT/cache/responsive/ID/typeOfPost/category/permalink

其中permalink是包含页面html代码的无扩展名文件。
不幸的是,对于缓存文件,我不能使用相同的URL结构,所以我不知道如何检查缓存文件是否存在,如果存在,则加载它,否则从数据库加载数据。
目前,我正在阅读检查缓存文件通过PHP,如果它存在,我加载它,否则我从数据库加载数据。
为了提高服务器性能,我想绕过PHP,通过Apache检查缓存文件,我认为这是正确的方法...不是吗?如果是这样,我该如何编写.htaccess文件?
这是我写的代码,但它不工作:

RewriteCond %{DOCUMENT_ROOT}/cache/responsive/([0-9]+)/([^/]+)/([^/]+)/([^/]+) -f
RewriteRule ^([^/]+)/([^/]+)/([0-9]+)/([^/]+)$ /cache/responsive/$3/$1/$2/$4 [L]
esyap4oy

esyap4oy1#

RewriteCond %{DOCUMENT_ROOT}/cache/responsive/([0-9]+)/([^/]+)/([^/]+)/([^/]+) -f
RewriteRule ^([^/]+)/([^/]+)/([0-9]+)/([^/]+)$ /cache/responsive/$3/$1/$2/$4 [L]

上述 * 条件 *(RewriteCond指令)应该检查RewriteRulesubstitution 字符串中是否存在您希望将请求重写到的同一个文件。正如您链接到的问题/示例所示,它在最终将请求重写为cache/$0.html之前检查%{DOCUMENT_ROOT}/cache/$0.html是否存在-正如您所看到的,它们是相同的。在您的代码中,它们显然不是。否则,您的规则的其他一切似乎都是正常的。
因此,您的规则应改为如下所示:

RewriteCond %{DOCUMENT_ROOT}/cache/responsive/$3/$1/$2/$4 -f
RewriteRule ^([^/]+)/([^/]+)/([0-9]+)/([^/]+)$ /cache/responsive/$3/$1/$2/$4 [L]

RewriteRule指令首先与请求的URL进行匹配。如果匹配,则前面的 conditionRewriteCond指令)检查“cache”文件是否存在。如果前面的 condition 成功,则RewriteRule指令执行所述的 * 替换 *。
但是,substitution 上的斜杠前缀是不必要的,应该省略,这样它就重写到文件系统路径,而不是URL路径(它会触发mod_rewrite将请求重新Map到文件系统)。
您也不需要分别捕获前两个路径段,因为它们该高速缓存文件路径中保持为一对。
例如,它可以写成:

RewriteCond %{DOCUMENT_ROOT}/cache/responsive/$2/$1/$3 -f
RewriteRule ^([^/]+/[^/]+)/(\d+)/([^/]+)$ cache/responsive/$2/$1/$3 [L]

\d是表示 digits 的速记字符类,与[0-9]相同

相关问题