Apache 中 RewriteRule 怎么配置 [END] 与 [L] 标志在重写中的区别

雨伟姑娘_4227

雨伟姑娘_4227

2026-11-15

988人浏览

原创

在 apache 的 mod_rewrite 模块中,[l] 和 [end] 标志都用于停止处理后续的 rewriterule,但作用范围不同。[l] 仅停止当前一轮请求处理中的规则匹配,如果重写后的 url 再次触发内部子请求(如通过 r 重定向后重新进入循环),规则会从头开始执行;而 [end] 则立即终止所有后续的处理过程,包括后续的 rewrite 阶段、回调以及任何内部重定向,直接返回结果给客户端或下一阶段。

Apache 中 RewriteRule 怎么配置 [END] 与 [L] 标志在重写中的区别

[L] 标志在循环重定向中的行为表现是什么

[L] 标志的作用是“Last”,它告诉 Apache 停止处理当前这一轮请求中的剩余 RewriteRule,并将控制权交给下一个处理阶段或重新评估重写后的 URL。如果重写的目标 URL 仍然符合虚拟主机或目录上下文中的其他规则,Apache 可能会再次进入重写引擎进行处理,从而形成循环。这在配置外部重定向(R=301 或 R=302)时尤为常见,因为浏览器收到重定向响应后,会发起一个新的请求,这个新请求会再次经过 Apache 的规则集,如果规则未正确排除已重定向的路径,就会陷入死循环。

Apache 中 RewriteRule 怎么配置 [END] 与 [L] 标志在重写中的区别

<virtualhost>
    ServerName example.com
    DocumentRoot /var/www/html

    <directory>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </directory>

    RewriteEngine On

    # 示例:将非 HTTPS 流量重定向到 HTTPS
    # 使用 [L] 标志
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

    # 假设后续还有针对特定路径的内部重写
    RewriteRule ^api/(.*)$ /backend/api.php?path=$1 [QSA,L]
</virtualhost>

在上述配置中,当用户访问 http://example.com/page 时,由于 %{HTTPS} 为 off,第一条规则匹配。Apache 应用 [L] 标志,停止处理该请求当前的规则列表,并生成一个 301 重定向响应,Location 头指向 https://example.com/page。浏览器接收到此响应后,会发起一个新的 GET 请求到 https://example.com/page。在这个新的请求中,Apache 再次加载配置文件,%{HTTPS} 现在为 on,第一条规则不匹配,因此跳过,继续处理第二条规则。如果第二条规则也匹配,则进行内部重写。关键在于,[L] 只影响当前请求实例的规则链,不影响新请求的规则链。如果配置不当,例如没有检查 %{HTTPS} 状态,而是简单地重写到自身且不加条件判断,[L] 无法阻止新请求再次触发规则。

[END] 标志如何彻底阻断重写引擎的后续处理

[END] 标志是 Apache 2.4 引入的功能,它比 [L] 更严格。当遇到 [END] 时,Apache 不仅停止处理当前的 RewriteRule 列表,还会立即终止整个请求处理过程中的所有后续重写阶段。这意味着,即使重写后的 URL 触发了新的内部子请求,或者进入了不同的处理阶段(如 post-read-request, pre-map-uri 等),只要之前有规则使用了 [END],就不会再有任何 mod_rewrite 规则被执行。这有效地防止了由重写引起的无限循环,并确保性能开销最小化,因为它避免了不必要的规则评估。

Apache Tika Content Extraction Hub
Apache Tika Content Extraction Hub

通过Apache Tika Server REST API从1400多种文件格式中提取文本和元数据。处理PDF、DOCX、PPTX、电子邮件归档以及带有MIME类型检测的嵌入式文档提取。

下载

Apache 中 RewriteRule 怎么配置 [END] 与 [L] 标志在重写中的区别

<virtualhost>
    ServerName example.com
    DocumentRoot /var/www/html

    <directory>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </directory>

    RewriteEngine On

    # 示例:将非 HTTPS 流量重定向到 HTTPS
    # 使用 [END] 标志
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [END,R=301]

    # 即使这里有更多规则,也不会被处理
    RewriteRule ^api/(.*)$ /backend/api.php?path=$1 [QSA,L]
</virtualhost>

在与 [L] 相同的场景下,使用 [END] 标志的行为略有不同。当用户访问 http://example.com/page 时,第一条规则匹配,Apache 应用 [END] 标志。此时,Apache 立即终止所有后续的 mod_rewrite 处理,并生成 301 重定向响应。与 [L] 不同的是,[END] 确保在当前请求的生命周期内,没有任何其他 RewriteRule 会被考虑。更重要的是,在某些复杂的配置中,如果重写操作导致了内部子请求(例如通过 ProxyPass 或 Satisfy 指令引发的内部重定向),[END] 会阻止这些子请求再次触发重写规则。虽然在这个简单的 HTTPS 重定向例子中,[L] 和 [END] 的效果看似相似,因为它们都触发了外部重定向,但在更复杂的重写逻辑中,[END] 提供了更强的控制力,确保一旦满足条件,就不再有任何进一步的规则评估发生。

当重写规则包含 [R] 标志时,[END] 与 [L] 对后续内部重定向的影响有何不同

当重写规则中包含 [R](重定向)标志时,Apache 会向客户端发送一个 HTTP 重定向响应,客户端随后会发起一个新的请求。在这种情况下,[L] 和 [END] 的区别主要体现在新请求的处理上。对于 [L],新请求会重新经过所有的 RewriteRule,如果规则设计不当,可能导致循环。对于 [END],虽然它主要作用于当前请求的处理链,但由于它终止了所有后续处理,包括可能触发的内部子请求,因此在某些高级场景中,它能更有效地防止意外的规则匹配。然而,需要注意的是,[END] 并不阻止客户端发起的新请求,它只是确保在当前请求的处理过程中,一旦遇到 [END],就不会再有其他规则被评估。如果希望在新请求中也避免规则匹配,需要在规则中加入适当的条件,如 %{ENV:REDIRECT_STATUS} 来检测是否为重定向后的请求。

# 更安全的重定向配置,结合 [END] 和条件检查
RewriteEngine On

# 检查是否已经过重定向,避免循环
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [END,R=301]

# 后续规则
RewriteRule ^api/(.*)$ /backend/api.php?path=$1 [QSA,L]

在这个改进的配置中,%{ENV:REDIRECT_STATUS} 是一个环境变量,当 Apache 处理内部重定向时,它会设置这个变量。通过检查它是否为空,可以确保只有在首次请求时才执行重定向。结合 [END] 标志,这不仅停止了当前请求的规则处理,还通过条件检查确保了新请求不会意外地再次触发重定向规则,除非明确需要。这种组合使用 [END] 和条件检查的方法,在处理复杂的 URL 重写和重定向逻辑时,提供了更高的安全性和可控性。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

apache

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
nginx 重启
nginx 重启

nginx重启对于网站的运维来说是非常重要的,根据不同的需求,可以选择简单重启、平滑重启或定时重启等方式。本专题为大家提供nginx重启的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.27

423

5

nginx 配置详解
nginx 配置详解

Nginx的配置是指设置和调整Nginx服务器的行为和功能的过程。通过配置文件,可以定义虚拟主机、HTTP请求处理、反向代理、缓存和负载均衡等功能。Nginx的配置语法简洁而强大,允许管理员根据自己的需要进行灵活的调整。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

4247

6

nginx配置详解
nginx配置详解

NGINX与其他服务类似,因为它具有以特定格式编写的基于文本的配置文件。本专题为大家提供nginx配置相关的文章,大家可以免费学习。

2023.08.04

7165

6

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

601

5

nginx报404怎么解决
nginx报404怎么解决

当访问 nginx 网页服务器时遇到 404 错误,表明服务器无法找到请求资源,可以通过以下步骤解决:1. 检查文件是否存在且路径正确;2. 检查文件权限并更改为 644 或 755;3. 检查 nginx 配置,确保根目录设置正确、没有冲突配置等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.07.09

1516

5

Nginx报404错误解决方法
Nginx报404错误解决方法

解决方法:只需要加上这段配置:try_files $uri $uri/ /index.html;即可。想了解更多Nginx的相关内容,可以阅读本专题下面的文章。

2024.08.07

3998

3

nginx部署php项目教程汇总
nginx部署php项目教程汇总

本专题整合了nginx部署php项目教程汇总,阅读专题下面的文章了解更多详细内容。

2026.01.13

122

12

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

2026.01.13

597

23

Nginx跨平台安装实操指南:Windows、macOS与Linux环境快速搭建
Nginx跨平台安装实操指南:Windows、macOS与Linux环境快速搭建

本指南详解Nginx在Windows、macOS及Linux系统的安装全流程。涵盖官方包解压、Homebrew一键部署、APT/YUM源配置及Docker容器化方案。无论新手或开发者,均可快速搭建运行环境,掌握跨平台核心指令,为后续配置与调优奠定坚实基础。

2026.03.16

179

12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Apache Maven 官方安装指南
Apache Maven 官方安装指南

共0课时 | 0人学习

Apache Maven 官方用户中心
Apache Maven 官方用户中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习