2

我的问题与SetEnvIf使用环境变量以及如何根据需要正确使用环境变量有关。我将解释我需要做什么,然后我已经拥有什么......

我需要在我的 htaccess 文件中设置 php 应用程序目录,因为一些重写规则使用该目录名称,并且我试图让管理员用户能够更改它。它目前在 php 中设置,并且在 htaccess 文件中手动更改它,然后在 php.ini 文件中再次进行更改。为了实现这一点,我目前有以下内容(就在重写规则中使用 env vars 提出建议)

SetEnvIf SERVER_PROTOCOL ".*" APP_DIR=application

它的设置方式是在任何重写规则之前获取 env var 集,就像SetEnv在任何重写规则之后处理一样,而SetEnvIf在之前处理。

现在我可以访问APP_DIRusing %{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]

因此,正如您可能看到的,我需要能够替代applicationAPP_DIR系统管理员更改路径,所以它可以是cmsadmin等等。

可悲的是,以下将不起作用

### 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 逻辑无法更改,因为它是一个长期存在的系统,如果它存在向后兼容性问题。

4

1 回答 1

1

用于RewriteCond匹配%{REQUEST_URI}环境变量直到第一个斜杠 ( /),然后RewriteRule使用^[^/]*/. 如果您不处理子目录,那将起作用;RewriteRule否则,您将不得不放弃正则表达式中的明确起点。

于 2013-07-28T05:19:11.630 回答