如果缓存文件夹存在则提供文件,否则使用 .htaccess 重写为 "index.php"
Serve file from cache folder if it exists, otherwise rewrite to "index.php" using .htaccess
假设在根目录中我有一个文件(称为index.php
)和一个文件夹(称为caches
).
我希望如果文件存在于缓存文件夹中,则为该文件提供服务 (caches/xxx.html
),否则请求发送到 index.php
.
例如我将向服务器发送请求:https://example.com/how-to-do
Apache 在 cache/
中首先搜索。如果 how-to-do.html
存在则发送(重写 Apache)how-to-do.html
否则发送请求到 index.php
.
这是我的 .htaccess
:
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews -Indexes
</IfModule>
RewriteEngine On
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
# Send Requests To Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
在最后一条规则之前(即在 # Send Requests To Front Controller...
评论之前),您可以添加如下内容:
# Check if cache file exists and serve from cache if it is
RewriteCond %{DOCUMENT_ROOT}/cache/[=10=].html -f
RewriteRule ^[^/.]+$ cache/[=10=].html [L]
这只检查针对文档根目录的请求,例如。 /how-to-do
- 如您的示例所示。它还假定您的 URL-path 不包含点(用于分隔文件扩展名)。它不针对具有多个路径段的请求,例如。 /foo/bar
.
要匹配多个路径段,只需从正则表达式字符 class 中删除斜杠即可。 IE。 ^[^.]+$
.
RewriteRule
模式^[^/.]+$
匹配任何不包含字符的non-emptyURL-path斜线 和 点 。换句话说,它匹配由单个路径段组成的 URL-paths,不包括文件(自然在文件扩展名前包含一个点)。在 .htaccess
中,与 RewriteRule
模式 匹配的 URL-path 而不是 以斜杠开头.
[=19=]
是一个反向引用,它包含与 RewriteRule
模式 匹配的整个 URL-path(即 ^[^/.]+$
).
参考
Apache 官方文档应该是您对此的参考(尽管文档相当简洁并且有些地方缺少示例):
假设在根目录中我有一个文件(称为index.php
)和一个文件夹(称为caches
).
我希望如果文件存在于缓存文件夹中,则为该文件提供服务 (caches/xxx.html
),否则请求发送到 index.php
.
例如我将向服务器发送请求:https://example.com/how-to-do
Apache 在 cache/
中首先搜索。如果 how-to-do.html
存在则发送(重写 Apache)how-to-do.html
否则发送请求到 index.php
.
这是我的 .htaccess
:
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews -Indexes
</IfModule>
RewriteEngine On
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
# Send Requests To Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
在最后一条规则之前(即在 # Send Requests To Front Controller...
评论之前),您可以添加如下内容:
# Check if cache file exists and serve from cache if it is
RewriteCond %{DOCUMENT_ROOT}/cache/[=10=].html -f
RewriteRule ^[^/.]+$ cache/[=10=].html [L]
这只检查针对文档根目录的请求,例如。 /how-to-do
- 如您的示例所示。它还假定您的 URL-path 不包含点(用于分隔文件扩展名)。它不针对具有多个路径段的请求,例如。 /foo/bar
.
要匹配多个路径段,只需从正则表达式字符 class 中删除斜杠即可。 IE。 ^[^.]+$
.
RewriteRule
模式^[^/.]+$
匹配任何不包含字符的non-emptyURL-path斜线 和 点 。换句话说,它匹配由单个路径段组成的 URL-paths,不包括文件(自然在文件扩展名前包含一个点)。在 .htaccess
中,与 RewriteRule
模式 匹配的 URL-path 而不是 以斜杠开头.
[=19=]
是一个反向引用,它包含与 RewriteRule
模式 匹配的整个 URL-path(即 ^[^/.]+$
).
参考
Apache 官方文档应该是您对此的参考(尽管文档相当简洁并且有些地方缺少示例):