我的问题与SetEnvIf
使用环境变量以及如何根据需要正确使用环境变量有关。我将解释我需要做什么,然后我已经拥有什么......
我需要在我的 htaccess 文件中设置 php 应用程序目录,因为一些重写规则使用该目录名称,并且我试图让管理员用户能够更改它。它目前在 php 中设置,并且在 htaccess 文件中手动更改它,然后在 php.ini 文件中再次进行更改。为了实现这一点,我目前有以下内容(就在重写规则中使用 env vars 提出建议)
SetEnvIf SERVER_PROTOCOL ".*" APP_DIR=application
它的设置方式是在任何重写规则之前获取 env var 集,就像SetEnv
在任何重写规则之后处理一样,而SetEnvIf
在之前处理。
现在我可以访问APP_DIR
using %{ENV:APP_DIR}
in rewrite 条件,以及任何 rewrite 规则的第二部分。
我需要实现的比这更复杂一些,因为应用程序目录不存在,而是一个重定向,让 PHP 应用程序知道作为后端而不是前端处理,例如当前重写(没有 env var)是
### ADMIN REWRITE
RewriteRule ^application\/?$ index.php?mode=administration&%{QUERY_STRING} [NC,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^application(\/(.*\/?))?$ index.php?page=$1&mode=administration&%{QUERY_STRING} [NC,L]
### FRONTEND REWRITE - Will ignore files and folders
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*\/?)$ index.php?page=$1&%{QUERY_STRING} [L]
因此,正如您可能看到的,我需要能够替代application
让APP_DIR
系统管理员更改路径,所以它可以是cms
或admin
等等。
可悲的是,以下将不起作用
### ADMIN REWRITE
RewriteRule ^%{ENV:APP_DIR}\/?$ index.php?mode=administration&%{QUERY_STRING} [NC,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^%{ENV:APP_DIR}(\/(.*\/?))?$ index.php?page=$1&mode=administration&%{QUERY_STRING} [NC,L]
### FRONTEND REWRITE - Will ignore files and folders
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*\/?)$ index.php?page=$1&%{QUERY_STRING} [L]
%{ENV:APP_DIR}
不能在重写的正则表达式中使用,因为正则表达式在任何重写之前被处理,并且 env vars.
有没有人达到我需要的?可以做到吗,即使这意味着要稍微调整重写逻辑?我必须声明,重写后的 php 逻辑无法更改,因为它是一个长期存在的系统,如果它存在向后兼容性问题。