如果缓存文件夹存在则提供文件,否则使用 .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 官方文档应该是您对此的参考(尽管文档相当简洁并且有些地方缺少示例):