Apache SetEnvIf并使用%{ENV:...}

时间:2012-07-08 19:00:41

标签: apache .htaccess url-rewriting environment-variables

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

我需要在我的htaccess文件中设置php应用程序目录,因为一些重写规则使用该目录名,我试图让admin用户能够更改它。它目前在php中设置,更改它是在htaccess文件中手动完成,然后再在php中完成。为实现这一目标,我目前有以下内容(关于在重写规则中使用env vars的建议)

SetEnvIf SERVER_PROTOCOL ".*" APP_DIR=application

设置为在任何重写规则之前设置env var的方式,因为SetEnv在任何重写规则之后处理,而SetEnvIf在之前处理。

现在我可以在重写条件下使用APP_DIR访问%{ENV:APP_DIR},以及任何重写规则的第二部分。

我需要实现的是比这更复杂,因为应用程序目录不存在,而是重定向让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以让系统管理员更改路径,因此它可以是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变种。

有没有人达到我的需要?可以这样做,即使这意味着在某种程度上调整重写逻辑吗?我必须声明重写后的php逻辑无法更改,因为它是一个长时间存在的系统,如果它存在向后兼容性问题。

1 个答案:

答案 0 :(得分:1)

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