我发现了这个问题:
它很有用,但是我不能为我系统写代码。
这是我的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]
1条答案
按热度按时间esyap4oy1#
上述 * 条件 *(
RewriteCond
指令)应该检查RewriteRule
substitution 字符串中是否存在您希望将请求重写到的同一个文件。正如您链接到的问题/示例所示,它在最终将请求重写为cache/$0.html
之前检查%{DOCUMENT_ROOT}/cache/$0.html
是否存在-正如您所看到的,它们是相同的。在您的代码中,它们显然不是。否则,您的规则的其他一切似乎都是正常的。因此,您的规则应改为如下所示:
RewriteRule
指令首先与请求的URL进行匹配。如果匹配,则前面的 condition(RewriteCond
指令)检查“cache”文件是否存在。如果前面的 condition 成功,则RewriteRule
指令执行所述的 * 替换 *。但是,substitution 上的斜杠前缀是不必要的,应该省略,这样它就重写到文件系统路径,而不是URL路径(它会触发mod_rewrite将请求重新Map到文件系统)。
您也不需要分别捕获前两个路径段,因为它们该高速缓存文件路径中保持为一对。
例如,它可以写成:
\d
是表示 digits 的速记字符类,与[0-9]
相同