SetEnvIf HTTP_HOST不起作用

时间:2012-02-09 14:05:21

标签: .htaccess apache2 setenv http-host ifdefine

我无法在.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?

修改 还有其他方法来实现上述目标吗?

4 个答案:

答案 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可以同时使用。
  • 一般情况下,Apache理解URI和FS域之间的区别并且不会混淆 - 即使您的开发人员经常这样做:-)在极少数情况下您需要明确引用FS名称,例如在{{ 1}}字符串,您可以使用/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> 文件中的配置伪指令。