.htaccess 如何检查 REQUEST_URI 不包含任何文件类型

.htaccess how to check REQUEST_URI doesn't contain any file type

我有两种路由机制

  1. 如果是 png 或 jpeg,重定向到名为 assets 的文件夹
  2. 如果不是 png 或 jpeg,重定向到 index.php

现在我想扩展文件类型,但是我不想一个一个地写,如何查看url末尾是否有扩展名?

当前重定向(手动一);

RewriteCond %{REQUEST_URI} \.(jpe?g|bmp|png|gif|svg|webp|mp3|mp4|css|js|woff2|woff|ttf|html|map)$
RewriteCond %{REQUEST_URI} frontend/assets
RewriteRule ^(.*)$  [NC,L,END]

我试过的;

RewriteCond %{REQUEST_URI} !^\.(.*)$
RewriteCond %{REQUEST_URI} frontend/assets
RewriteRule ^(.*)$  [NC,L,END]

你可以这样做:

DirectoryIndex index.php

RewriteEngine On

# 1. Exception for URL requests that contain a file extension
#  - Prevents further processing
RewriteRule \.\w{2,5}$ - [END]

# 2. Rewrite everything else (including directory requests) to "index.php"
RewriteRule . index.php [END]

“文件扩展名”被视为一个点,后跟 a-zA-Z0-9 和 [=18 范围内的字符中的 2 到 5 个字符=](下划线)。

虽然以上两条规则可以合二为一:

# 1 + 2. Rewrite everything that does not have a file extension to "index.php"
RewriteRule !\.\w{2,5}$ index.php [END]

(细微差别是这条规则也将根目录重写为index.php,而不是依赖mod_dir。)

如果你只想将所有内容路由到 index.php,除了文件和目录,那么只需使用以下内容(这将替换上面的 everything):

FallbackResource /index.php

查看您当前的规则:

RewriteCond %{REQUEST_URI} \.(jpe?g|bmp|png|gif|svg|webp|mp3|mp4|css|js|woff2|woff|ttf|html|map)$
RewriteCond %{REQUEST_URI} frontend/assets
RewriteRule ^(.*)$  [NC,L,END]

这是一个“例外”。如果满足条件,它会阻止进一步处理。 (它实际上并没有做任何进一步处理 URL 的事情,它只是防止请求被重写到 front-controller,这大概是随后发生的。)

似乎没有必要检查请求的 URL 是否以文件扩展名结尾并且 URL-path 包含 frontend/assets。如果您的所有资产都包含在一个已知位置,那么最好只排除该已知位置。虽然你在评论中也提到了一个 .php 扩展,它可能不属于“资产”。

也不需要捕获所请求的 URL-path 并将请求重写为相同的。要表示“无替换”,只需使用一个 连字符 (就像我在上面的规则中所做的那样)。

NCL 标志在这里也是多余的。 ENDL 的“更强”版本,可防止重写引擎进一步传递。

RewriteCond %{REQUEST_URI} !^\.(.*)$
:

negated 表达式与您要实现的目标相反,只是正则表达式也不正确。当请求的 URL-path 与 .<anything> 形式的 URL 不匹配时,此 条件 成功。这总是会成功的,因为 REQUEST_URI 服务器变量 总是 以斜杠开头。