首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果存在,使用Apache mod_rewrite重定向到静态内容。

如果存在,使用Apache mod_rewrite重定向到静态内容。
EN

Stack Overflow用户
提问于 2012-03-02 19:37:42
回答 2查看 768关注 0票数 1

背景

我正在通过创建一个静态缓存来优化一些高流量页面。由于内容不经常更改,生成缓存并使其失效的机制非常简单。不过,目前我正在通过PHP (基本file_exists()检查)访问缓存。我想把它提升到web服务器级别,以完全删除PHP。

等级库

我会有成千上万的缓存页面。所以我设想的目录树是:

代码语言:javascript
复制
year -> first id of digit -> second id of digit -> id.html

我用这种方式将它分开,以避免单个目录中有10个文件--据我所知,这是一个性能上的问题。我熟悉mod_rewrite,但不太确定如何捕获必要的URL片段并确定文件是否存在。

下面是一个传入URL的示例:

代码语言:javascript
复制
/2011/37823/some_slug

一些伪代码,使用上面的URL:

代码语言:javascript
复制
RewriteCond %{REQUEST_URL} ^(\d{4})/...
RewriteCond /cache/$1/$3/$4/$2.html -f
RewriteRule - /cache/$1/$3/$4/$2.html [L]

问题

  • 如何为上面的内容创建RewriteRule
  • 是否有更好的方法(使用灯栈的技术)?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-02 19:53:14

这将需要调整,因为regex与您所列出的模式不匹配(顺序更改),但是下面的内容基于您的示例URL:

代码语言:javascript
复制
RewriteCond %{DOCUMENT_ROOT}/cache/$1$2$3\.html -f
RewriteRule ^(\d+)(/\d+)(/[^/]+)$ /cache/$1$2$3.html [L]

如果您想要更多嵌套(基于‘d的第一位和第二位的文件夹,但忽略URL中间部分的其余部分),则如下所示:

代码语言:javascript
复制
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。但是,它将检查每个资源请求的模式。

票数 1
EN

Stack Overflow用户

发布于 2012-03-02 20:23:05

我认为,这应该适用于你:

代码语言:javascript
复制
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在重写之后将查询字符串放回(不确定是否需要重写)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9539325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档