我无法访问 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}
这些模块中的环境变量?