来自Cahe的Mod_rewrite和%{DOCUMENT_ROOT}%{REQUEST_URI}

时间:2012-05-18 03:39:43

标签: apache mod-rewrite

晚上,

我正在运行以下文件:

/家庭/用户/网络/网站/ gubbinz /

Web服务器根目录是Web /

当我加载网址时:localhost / sites / gubbinz / index.php?request = home.html

我想查看是否有文件./sites/gubbinz/cache/home.html

我可以使用以下方法解决此问题:

RewriteCond %{QUERY_STRING}     ^request=(.*)    [NC]
RewriteCond /home/user/Web/sites/gubbinz/cache/home.html -f
RewriteRule ^.+$ cache/%1 [QSA,L]

但不是这样的:

RewriteCond %{QUERY_STRING}     ^request=(.*)    [NC]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}cache/home.html -f
RewriteRule ^.+$ cache/%1 [QSA,L]

我更喜欢后者,因为这意味着我可以为localhost和live提供一条规则。有谁知道我哪里出错了?

N.B。我没有设置RewriteBase。

1 个答案:

答案 0 :(得分:1)

经过一番摆弄后,这是我能想到的最好的服务器,可以跨服务器运行,而不需要多个服务器条件:

RewriteCond %{SCRIPT_FILENAME}  ^(.+)\/index.php$                   [NC]
RewriteRule .* - [E=PATH:%1]

RewriteCond %{QUERY_STRING}     ^request=(.*)    [NC]
RewriteCond %{ENV:PATH}/cache/%1.html -f
RewriteRule ^.+$ cache/%1.html [QSA,L]

RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^.+$ index.php?request=$0 [QSA,L]

第一部分获取请求来自的目录的完整路径,并将其保存为环境变量。 index.php从末尾开始修剪。

第二部分获取包含实际加载的URL的内部重定向,检查是否存在HTML的缓存版本以及是否执行内部重定向。

第三部分采用“搜索引擎友好URL”并进行内部重定向到index.php?request = {URL}。

简而言之,您加载了网址:

http://domain.com/page/sub-page

第三个条件设置将其重定向到:

http://domain.com/index.php?request=page/sub-page

然后第二组(在第一条规则中设置了env.var。)看到服务器上是否存在./cache/page/sub-page.html;如果是,则该页面将显示在浏览器中。

N.B。对于任何可能发现使用第三个条件集不是必需的人,你可以用两个规则来做到这一点。我使用重定向到index.php?request = 555作为我的PHP处理的一部分。