AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1165053
Accepted
TRiG
TRiG
Asked: 2024-09-10 21:36:22 +0800 CST2024-09-10 21:36:22 +0800 CST 2024-09-10 21:36:22 +0800 CST

在 Apache 配置中,重定向或重写规则是否优先?

  • 772

我希望 Apache 上的域名纯粹作为重定向存在。为此,我创建了/etc/apache2/sites-available/redirect.example.info.conf以下内容:

<VirtualHost *:80>
    ServerName redirect.example.info
    ServerAdmin webmaster@localhost
    Redirect / https://example.com/

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

当我运行的时候certbot --apache,它被重写为:

<VirtualHost *:80>
    ServerName redirect.example.info
    ServerAdmin webmaster@localhost
    Redirect / https://example.com/

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

RewriteEngine on
RewriteCond %{SERVER_NAME} =redirect.example.info
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

/etc/apache2/sites-available/redirect.example.info-le-ssl.conf并创建一个新文件:

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName redirect.example.info
    ServerAdmin webmaster@localhost
    Redirect / https://example.com/

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

SSLCertificateFile /etc/letsencrypt/live/ca-webs.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/ca-webs.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

这确实按预期工作。重定向运行http://redirect.example.info→ https://redirect.example.info→ https://example.com。但我不清楚它是如何工作的。重写的文件既有Redirect命令,又有RewriteRule命令,我本以为Redirect(先来)会优先。这个文件实际上是如何评估的?

apache2
  • 1 1 个回答
  • 25 Views

1 个回答

  • Voted
  1. Best Answer
    HBruijn
    2024-09-10T23:50:28+08:002024-09-10T23:50:28+08:00

    据我所知,certbot --apache它不会对现有的 HTTP VirtualHost 进行严格检查,它只是复制所有现有指令并添加 TLS 指令以生成新的 HTTPS VirtualHost。
    然后修改普通的 HTTP VirtualHost 以包含条件 HTTP --> HTTPS 重定向(仅重定向 certbot 已为其配置证书的 URI)。

    生成的配置适用于大多数用例,但对于您而言,结果并不理想,我建议您手动编辑纯 HTTP 虚拟主机。删除Rewrite*certbot 添加的指令并恢复到原始配置,将访问者直接从 发送到 ,http://redirect.example.info 以 https://example.com防止中间重复访问https://redirect.example.info。


    至于为什么Rewrite*指令虽然出现在Redirect指令之后却具有优先权:这是因为有效的 apache httpd 配置不仅仅是配置指令放置和分组的位置、顺序和容器的结果,还取决于指令属于哪个模块。

    该信息在手册https://httpd.apache.org/docs/current/sections.html#merging的“合并”部分中并不明显

    模块和配置节之间的关系

    在阅读配置部分如何合并后,经常会出现的一个问题与特定模块(如 mod_rewrite)的指令如何以及何时处理有关。答案并不简单,需要一些背景知识。每个 httpd 模块管理自己的配置,并且其每个指令在httpd.conf特定上下文中指定一个配置。httpd 在读取命令时不会执行命令。

    在运行时,httpd 的核心会按上述顺序迭代已定义的配置部分,以确定哪些配置部分适用于当前请求。当第一个部分匹配时,它将被视为此请求的当前配置。如果后续部分也匹配,则每个在任一部分中具有指令的模块都有机会将其配置合并到两个部分之间。结果是第三个配置,并且该过程继续进行,直到评估了所有配置部分。

    完成上述步骤后,HTTP 请求的“真正”处理就开始了:每个模块都有机会运行并执行它们想要的任何任务。它们可以从 httpd 的核心中检索自己的最终合并配置,以确定它们应该如何行动。

    对于 mod_rewrite 来说,微妙的细节可能在于这句话“每个模块都有机会运行并执行它们喜欢的任何任务”。
    模块可以/必须通过请求处理钩子注册自己 ,以便能够在正确的时刻“做它们喜欢的事情”,mod_rewrite 使用它来首先(或至少提前)使用APR_HOOK_FIRST钩子https://github.com/apache/httpd/blob/c72b74ccef72fb56becd55888a3aa783c4ab5b6b/modules/mappers/mod_rewrite.c#L5702

    据我所知,这就是Rewrite*指令优先于其他指令的方式,无论其他指令的排序方式和位置如何。

    您可以通过启用mod_info来了解钩子和所有启用的模块及其顺序(不要忘记将 ACL 添加到服务器信息 URL)。

    • 0

相关问题

  • 使用本地 IP 地址访问本地网络上服务器的 Web 服务器

  • 如何转发来自我的网络服务器的请求?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve