我的问题与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
以让系统管理员更改路径,因此它可以是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变种。
有没有人达到我的需要?可以这样做,即使这意味着在某种程度上调整重写逻辑吗?我必须声明重写后的php逻辑无法更改,因为它是一个长时间存在的系统,如果它存在向后兼容性问题。
答案 0 :(得分:1)
使用RewriteCond
将%{REQUEST_URI}
与环境变量匹配,直到第一个斜杠(/
),然后使用RewriteRule
启动^[^/]*/
正则表达式。如果你不处理子目录,这将有效;否则,你将不得不放弃RewriteRule
正则表达式中明确的起点。