如果存在,从缓存文件夹提供文件,否则使用.htaccess重写为“index.php”

s4n0splo  于 2022-11-16  发布在  PHP
关注(0)|答案(1)|浏览(112)

假设在根目录中我有一个文件(称为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>
k0pti3hp

k0pti3hp1#

在最后一条规则之前(即# Send Requests To Front Controller...注解之前),您可以添加如下内容:

# Check if cache file exists and serve from cache if it is
RewriteCond %{DOCUMENT_ROOT}/cache/$0.html -f
RewriteRule ^[^/.]+$ cache/$0.html [L]

这只会检查以文件根目录为目的的要求,例如/how-to-do-如您的范例所示。它也假设您的URL路径不包含点(用来分隔副档名)。它不会以具有多个路径区段的要求为目的,例如/foo/bar
要匹配多个路径段,只需从正则表达式字符类中删除斜杠。即^[^.]+$
RewriteRulepattern^[^/.]+$匹配不包含字符 * 斜杠 * 和 * 点 * 的任何非空URL路径。换句话说,它匹配由单个路径段组成的URL路径,不包括文件(文件扩展名前自然包含点)。在.htaccess中,由RewriteRulepattern 匹配的URL路径 * 不 * 以斜杠开头。
$0是包含与RewriteRule * 模式 *(即^[^/.]+$)匹配的完整URL路径的反向引用。

参考

官方Apache文档应该是您对此的参考(尽管文档相当简洁,有些地方缺少示例):


相关问题