我无法在.htaccess的这一部分工作,IfDefine
永远不会运行。我做错了什么,setenvif
mod已启用。
RewriteBase /
SetEnvIf HTTP_HOST ^localhost$ local
<IfDefine local>
RewriteBase /codeigniter-app/
</IfDefine>
SetEnvIf HTTP_HOST ^testing.alex.com$ testing
<IfDefine testing>
RewriteBase /app/
</IfDefine>
这基于:With mod_rewrite can I specify a RewriteBase within a RewriteCond?
修改 还有其他方法来实现上述目标吗?
答案 0 :(得分:8)
SetEnvIf适用于请求标头。所以你想使用HOST而不是HTTP_HOST。 E.g。
SetEnvIf HOST ^localhost$ local
答案 1 :(得分:4)
SetEnvIf
设置环境变量。它没有为Apache定义一个新常量。
请参阅SetEnvIf
manual并将其与<IfDefine>
manual进行比较。
答案 2 :(得分:3)
我的答案是,如果Apache不允许你做你想做的事情,那是因为AFAIK你不需要这样做来做真正需要做的事情
您似乎正在尝试创建一个本地环境,该环境在配置术语中镜像您的(远程)基于服务器的测试环境。但是,您会混淆URI命名空间和文件系统命名空间,而在Apache Server中,这些是完全不同的。例如,<Location>
指令对前者进行操作,<Directory>
指令对后者进行操作。 .htaccess
有两种截断方式,因此您需要了解参数何时在其中一个上运行。
例如,我有一个共享服务帐户,可以为多个子域*.ellisons.org.uk
提供服务 - 例如我的博客位于http://blog.ellisons.org.uk/。我开发了一个Ubuntu笔记本电脑和一个镜像我的服务提供商运行的LAMP / suPHP配置的VM(但我有root访问权限,可以看到VM上的重写日志等)我在{{1}中静态分配IP地址私有地址空间,并且
192.168.1.0/24
个symonyms
/etc/hosts
但除此之外,URI空间是相同的,因此127.0.1.1 ... blog.ellisons.org.home forum.ellisons.org.home ...
192.168.1.250 ... blog.ellisons.org.vm ...
从我的服务器,笔记本电脑或VM加载我的CSS,具体取决于XX = uk,home,vm
然而,我的笔记本电脑上的docroot是Debian标准blog.ellisons.org.XX/themes/terry/all.css
,但另外两个是/var/www
(我的主机命名约定)。然而,我的应用程序包括/websites/LinuxPackage02/el/li/so/ellisons.org.uk/public_html
文件是相同的,这些反映多次使用的唯一方法是在regexp中我用作正则表达式来匹配%{HTTP_HOST} .htaccess
。
所以你的例子:
(\w+)\.ellisons.\org\.(?:uk|home|vm)
到您本地PC上的物理目录/app
。您可以在服务器或vhost配置中使用/codeigniter-app
指令来执行此操作。Alias
采用URI路径参数,因此RewriteBase
可以同时使用。/app
- 但如果您的服务是共享服务,则可能必须使用环境变量(我的是RewriteCond
)。我phpinfo()会告诉你哪个。 %{DOCUMENT_ROOT}
替换中使用相对地址(无前导斜杠)。总而言之,通过一些思考,您可以使您的配置在逻辑上与Apache提供的相同 - 并不比尝试以从未设计到产品中的方式执行条件执行更好吗?
答案 3 :(得分:0)
您还需要通过为虚拟主机配置添加以下内容来确保['hello', 'word']
文件被实际使用:
.htaccess
A伪指令使得可以基于每个目录覆盖DocumentRoot /var/www/html
<Directory /var/www/html>
AllowOverride All
# Other stuff
</Directory>
文件中的配置伪指令。