.htaccess 如何检查 REQUEST_URI 不包含任何文件类型
.htaccess how to check REQUEST_URI doesn't contain any file type
我有两种路由机制
- 如果是 png 或 jpeg,重定向到名为 assets 的文件夹
- 如果不是 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-z
、A-Z
、0-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 并将请求重写为相同的。要表示“无替换”,只需使用一个 连字符 (就像我在上面的规则中所做的那样)。
NC
和 L
标志在这里也是多余的。 END
是 L
的“更强”版本,可防止重写引擎进一步传递。
RewriteCond %{REQUEST_URI} !^\.(.*)$
:
此 negated 表达式与您要实现的目标相反,只是正则表达式也不正确。当请求的 URL-path 与 .<anything>
形式的 URL 不匹配时,此 条件 成功。这总是会成功的,因为 REQUEST_URI
服务器变量 总是 以斜杠开头。
我有两种路由机制
- 如果是 png 或 jpeg,重定向到名为 assets 的文件夹
- 如果不是 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-z
、A-Z
、0-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 并将请求重写为相同的。要表示“无替换”,只需使用一个 连字符 (就像我在上面的规则中所做的那样)。
NC
和 L
标志在这里也是多余的。 END
是 L
的“更强”版本,可防止重写引擎进一步传递。
RewriteCond %{REQUEST_URI} !^\.(.*)$ :
此 negated 表达式与您要实现的目标相反,只是正则表达式也不正确。当请求的 URL-path 与 .<anything>
形式的 URL 不匹配时,此 条件 成功。这总是会成功的,因为 REQUEST_URI
服务器变量 总是 以斜杠开头。