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

Moj*_*ian 13 php apache .htaccess mod-rewrite

我为我的网站定义了一个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]
Run Code Online (Sandbox Code Playgroud)

我想将我的站点根路径保存在这样的变量中:

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]
Run Code Online (Sandbox Code Playgroud)

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

<?php $specialPath = getenv('BASE_PATH'); var_dump($specialPath)?>
Run Code Online (Sandbox Code Playgroud)

它显示正确的值/cig/base3.

什么是我的代码中的问题,我该如何解决这个问题?

Pan*_*ack 10

您不能使用SetEnv这种方式,因为它尚未处理.

此指令设置的内部环境变量在大多数早期请求处理指令运行后设置,例如访问控制和URI到文件名映射.如果您设置的环境变量是作为RewriteRule指令的早期处理阶段的输入,则应该使用SetEnvIf设置环境变量.

你在找什么setenvif而不是SetEnv

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

SetEnvIf Request_URI "^.*" base_path=/cig/base3
Run Code Online (Sandbox Code Playgroud)

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

  • ^ @ mrez.ir这就是我的评论内容...我在工作,所以我真的没有时间写一个完全格式化的连贯答案;)SetEnvIf(与SetEnv不同)将在mod_rewrite之前运行-但您也可以使用mod_rewrite本身来设置环境变量-都可以。 (2认同)
  • @ mrez.ir-两者都以不同的方式做相同的事情-两种方式都以环境变量集结尾。如果我将变量与RewriteRules一起使用,我更喜欢通过RewriteRule进行操作……但这确实无关紧要。 (2认同)