如何在 Apache .htaccess 文件中定义参数/常量

如何在 Apache .htaccess 文件中定义参数/常量

我无法访问 Apache 服务器配置文件,只能通过.htaccess文件来影响配置。不幸的是,这限制了一些可能想要做的事情。例如,将所有 HTTP 请求重定向到 HTTPS 的最简单方法是:

<If "%{HTTPS} != 'on'">
    Redirect permanent / https://www.my-domain.com/
</If>

但是,这迫使我对域名进行硬编码,因此我无法.htaccess轻松地重复使用此文件。就我而言,同一个站点可以从多个不同的域访问(只有一个底层文件系统),因此这对我来说根本不是一个选择。我无法通过重定向来解决这个问题,https://%{SERVER_NAME}/因为该Redirect语句不支持这种变量替换(<Location><LocationMatch>部分除外, 但是当然,.htaccess这些文件不可用)。

因此,如果我想要一个通用/可重用的.htaccess配置,我被迫使用mod_rewrite而不是,Redirect这样我就可以使用服务器变量替换。相应的解决方案是

RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [R=permanent,L]

这已经相当复杂了,更不用说可能与我可能想要设置的其他规则的交互——最好是,由于它的复杂性,mod_rewrite我希望将其使用保持在最低限度。mod_rewrite


另一个我完全没有找到解决方法的例子是,它根本mod_substitute不支持扩展。如果我的站点位于服务器上的特定子目录 () 中,并且我想对该目录中 HTML 页面上的所有链接进行后处理,我可以这样做%{variable}sub_dir

AddOutputFilterByType SUBSTITUTE text/html
Substitute s~/sub_dir/[^\s]+/~/sub_dir/something_else/~

因此,在这里,我必须对目录进行硬编码sub_dir,我必须替换每个我可能想要在其中执行相同替换的子目录(不,我没有访问根 URL 的权限/)。如果这是一条重写规则,我可以像这样定义一个环境变量%{env:site_dir}

RewriteRule ^ - [E=site_dir:/sub_dir]

但是这个环境变量对我没有用,因为mod_substitute它无法解释这些。


那么,有没有办法避免在mod_alias或等模块中对此类域和子目录进行硬编码和重复mod_substitute,因为这些模块没有相同的机制mod_rewrite?例如,通过以某种方式访问%{env:variable}​​这些模块中的环境变量?

相关内容