4

我正在编写一个 .htaccess 文件,它将检查请求的页面是否存在于缓存中。为了执行检查(并保存输入),我设置了一个带有缓存位置的 ENV 变量:

# all this works as I expect #
<IfModule mod_rewrite.c>

RewriteEngine On
RewriteBase /some/path/
RewriteRule ^(.*)$ - [E=rewritebase:/some/path/,E=cache:%{ENV:rewritebase}cache/] 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}%{ENV:cache}$1\.html -f
RewriteRule ^(.*)$ $1\.html [L]

</IfModule>

如您所见,我还必须将一个 ENV 变量设置为“替代” RewriteBase 值。我宁愿不这样做,因为如果 RewriteBase 改变了,我也必须记住改变 ENV 变量。最终,这可能是其他人使用的 CMS 的一部分,我希望它的配置尽可能简单/直接,出错的机会最少。我希望能够只设置ENV:cache变量无需设置ENV:rewritebase变量,就像这样(或类似的):

# doesn't work #
RewriteRule ^(.*)$ - [E=cache:%{RewriteBase}cache/]

正如暗示的那样,该cache/目录将始终位于 RewriteBase 中指定的目录内。[编辑]
。. . 但是,它并不总是存在此 .htaccess 文件的物理路径。
[/编辑]

我也很乐意听到其他建议。谢谢大家!

4

2 回答 2

5

为运行 Apache的用户使用环境变量,

#.profile of Apache user
rewritebase = "some/path"

然后在 .htaccess 文件中引用它:

#.htaccess file
RewriteBase {$rewritebase}    
RewriteRule ^(.*)$ - [E=cache:%{ENV:rewritebase}cache]

伪 ReWriteRule 也可以解决问题:

#This will be true for any user agent
RewriteCond  %{HTTP_USER_AGENT}  ^.*

#Replace / with / and set the rewritebase variable to /some/path
RewriteRule  /(\/some\/path)* / [E=rewritebase:$1/some/path]

#Reference the rewritebase variable
RewriteBase {$rewritebase}

#Redefine the rewritebase variable
RewriteRule ^(.*)$ - [E=rewritebase:$1]
于 2012-07-02T18:27:43.547 回答
1

我找到了使用 rewrite base 值的解决方案。这只是一个点。. 这是有效的。如果定义了 rewritebase,它将转发到 rewritebase。如果 rewritebase 没有定义,它会转发到代码的目录。

RewriteRule ^index.html(/?)$ ./ [R=301,L]
于 2016-03-13T17:09:10.630 回答