假设在根目录中我有一个文件(称为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>
1条答案
按热度按时间k0pti3hp1#
在最后一条规则之前(即
# Send Requests To Front Controller...
注解之前),您可以添加如下内容:这只会检查以文件根目录为目的的要求,例如
/how-to-do
-如您的范例所示。它也假设您的URL路径不包含点(用来分隔副档名)。它不会以具有多个路径区段的要求为目的,例如/foo/bar
。要匹配多个路径段,只需从正则表达式字符类中删除斜杠。即
^[^.]+$
。RewriteRule
pattern^[^/.]+$
匹配不包含字符 * 斜杠 * 和 * 点 * 的任何非空URL路径。换句话说,它匹配由单个路径段组成的URL路径,不包括文件(文件扩展名前自然包含点)。在.htaccess
中,由RewriteRule
pattern 匹配的URL路径 * 不 * 以斜杠开头。$0
是包含与RewriteRule
* 模式 *(即^[^/.]+$
)匹配的完整URL路径的反向引用。参考
官方Apache文档应该是您对此的参考(尽管文档相当简洁,有些地方缺少示例):
RewriteRule
指令RewriteCond
指令