如何在 .htaccess 文件中定义变量并使用它?

Posted

技术标签:

【中文标题】如何在 .htaccess 文件中定义变量并使用它?【英文标题】:how can I define variable in .htaccess file and use it? 【发布时间】:2015-08-04 14:51:04 【问题描述】:

我已经为我的网站定义了一个具有此代码的 htaccess 文件:

RewriteEngine on
RewriteBase /

RewriteRule ^bit_auth\/?(.*)$ /cig/base3/auth/$1 [R=301,NC,L]
RewriteCond $1 !^(index\.php|images|robots\.txt|assets|themes|includes)
RewriteRule ^(.*)$ /cig/base3/index.php/$1 [L]

我想将我的站点根路径保存在一个变量中,如下所示:

RewriteEngine on
RewriteBase /
SetEnv BASE_PATH "/cig/base3"

RewriteRule ^bit_auth\/?(.*)$ %ENV:BASE_PATH/auth/$1 [R=301,NC,L]
RewriteCond $1 !^(index\.php|images|robots\.txt|assets|themes|includes)
RewriteRule ^(.*)$ %ENV:BASE_PATH/index.php/$1 [L]

因为我以后可能需要在更多代码中使用BASE_PATH 值,而且它可能会被更改,我不想每次都在我的 htaccess 文件中搜索和替换。 但是当我使用上面的代码时,在 htaccess 文件中 %ENV:BASE_PATH 返回一个空值,而不是预期的 /cig/base3在 php 中调用它时使用:

<?php $specialPath = getenv('BASE_PATH'); var_dump($specialPath)?>

它显示了正确的 /cig/base3 值。

我的代码有什么问题,我该如何解决?

【问题讨论】:

Apache 加载/运行模块的顺序有一个怪癖 - mod_rewrite 总是在 SetEnv 之前运行,因此您不能使用 SetEnv 设置要在 RewriteRiule 中使用的环境变量;但是您可以使用 RewriteRule 设置变量;例如RewriteRule .* - [E=BASE_PATH:/cig/base3] @CD001 我不完全理解为什么要以这种方式使用它,但是当我将您的代码插入到我的 htaccess 文件中时,它按预期工作。您是否有更多描述/细节的参考资料以及非经验用户的示例?或者请描述更多。 【参考方案1】:

你不能那样使用SetEnv,因为它还没有被处理。

该指令设置的内部环境变量设置后 大多数早期请求处理指令都会运行,例如访问 控制和 URI 到文件名的映射。如果环境变量 你正在设置的意思是作为这个早期处理阶段的输入 例如 RewriteRule 指令,您应该改为设置 带有 SetEnvIf 的环境变量。

您要查找的是 setenvif 而不是 SetEnv

所以你应该可以做类似的事情

SetEnvIf Request_URI "^.*" base_path=/cig/base3

http://httpd.apache.org/docs/2.2/mod/mod_setenvif.html#setenvif

【讨论】:

^ @mrez.ir 这就是我的评论所要表达的意思......我在工作,所以我没有时间写一个完全格式化的连贯答案;) SetEnvIf (与 SetEnv 不同)将在 mod_rewrite 之前运行 - 但您也可以使用 mod_rewrite 本身设置环境变量 - 两者都可以。 但两个答案都是正确的我不明白我为什么要这样做?哪个更正确? @mrez.ir - 两者都做同样的事情,只是方式不同 - 无论哪种方式,你最终都会设置一个环境变量。如果我将变量与 RewriteRules 一起使用,我更喜欢通过 RewriteRule 来实现......但这真的没关系。 它会减慢原始 htaccess 行为吗?我的意思是加载两次? @mrez.ir .htaccess 仅在扫描目录时读取一次,但在每次请求时都会读取 .htaccess 并相应地处理所有内容。因此,它不会真正引入比默认行为更慢的速度。

以上是关于如何在 .htaccess 文件中定义变量并使用它?的主要内容,如果未能解决你的问题,请参考以下文章

如何在外部配置文件中定义一个变量并在 app.module 中使用它

使用 apache config 和 htaccess 为开发和生产动态设置配置变量

如何通过 htaccess 保护商店?

.htaccess 用 WordPress 插件重写

使用 .htaccess 编辑 url 并删除查询名称 [关闭]

M2DOC如何定义一个变量并使用它