0

晚上,

我正在运行一个文件:

/home/user/Web/sites/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 设置一条规则并进行直播。有谁知道我哪里出错了?

注意我没有 RewriteBase 集。

4

1 回答 1

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 是否存在于服务器上;如果是,则该页面将显示给浏览器。

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

于 2012-05-18T18:11:36.220 回答