3

我无法让它在 .htaccess 的这一部分工作,IfDefine永远不会运行。我在做什么错,setenvifmod已启用。

RewriteBase /

SetEnvIf HTTP_HOST ^localhost$ local
<IfDefine local>
  RewriteBase /codeigniter-app/
</IfDefine>

SetEnvIf HTTP_HOST ^testing.alex.com$ testing
<IfDefine testing>
    RewriteBase /app/
</IfDefine>

这基于:使用 mod_rewrite 我可以在 RewriteCond 中指定 RewriteBase 吗?

编辑: 还有其他方法可以完成上述操作吗?

4

4 回答 4

12

SetEnvIf 适用于请求标头。所以你想使用 HOST 而不是 HTTP_HOST。例如

SetEnvIf HOST ^localhost$ local
于 2012-02-29T22:50:47.937 回答
5

SetEnvIf设置环境变量。它没有定义 Apache 使用的新常量。

查看SetEnvIf手册并将其与<IfDefine>手册进行比较。

于 2012-02-09T14:08:44.437 回答
3

如果 Apache 不允许你在这里做你想做的事情,我的回答是,但那是因为 AFAIK 你不需要这样做来做你真正需要做的事情。

似乎您正在尝试创建一个本地环境,该环境在配置方面反映了您的(远程)基于服务器的测试环境。但是,您混淆了 URI 名称空间和文件系统名称空间,而在 Apache Server 中,它们完全不同。例如,<Location>指令作用于前者,<Directory>指令作用于后者。 .htaccess有点跨越两者,因此您需要了解参数何时对一个或另一个起作用。

例如,我有一个为多个子域提供服务的共享服务帐户*.ellisons.org.uk——例如我的博客位于http://blog.ellisons.org.uk/上。我在 Ubuntu 笔记本电脑和一个镜像我的服务提供商运行的 LAMP/suPHP 配置的 VM 上进行开发(但我有 root 访问权限并且可以在 VM 上查看重写日志等) 我在我的192.168.1.0/24私有地址空间中静态分配 IP 地址并且有/etc/hosts同义词

127.0.1.1      ... blog.ellisons.org.home forum.ellisons.org.home ...
192.168.1.250  ... blog.ellisons.org.vm ...

但除此之外,URI 空间是相同的,因此blog.ellisons.org.XX/themes/terry/all.css根据 XX=uk,home,vm 从我的服务器、笔记本电脑或 VM 加载我的 css

但是,我笔记本电脑上的 docroot 是 Debian 标准/var/www的,但在另外两个上是/websites/LinuxPackage02/el/li/so/ellisons.org.uk/public_html(我的主机命名约定)。然而,我的应用程序(包括.htaccess文件)是相同的,它们反映这种多重用途的唯一方法是在正则表达式中,我使用正则表达式来匹配 %{HTTP_HOST} (\w+)\.ellisons.\org\.(?:uk|home|vm)

所以对于你的例子:

  • 没有什么可以阻止您将请求指向本地 PC 上/app的物理目录。/codeigniter-app您可以在服务器或虚拟主机配置中使用Alias指令来执行此操作..
  • RewriteBase采用 URI 路径参数,因此/app两者都适用。
  • 一般来说,Apache 理解 URI 和 FS 域之间的区别并且不会感到困惑——甚至您的开发人员也经常这样做:-) 在极少数情况下,您需要明确引用 FS 名称,比如在RewriteCond字符串中,您可以使用%{DOCUMENT_ROOT}- 虽然如果您的服务是共享服务,您可能必须改用环境变量(我的是%{ENV:DOCUMENT_ROOT_REAL})。我 phpinfo() 会告诉你哪个。
  • 确保在任何RewriteRule替换中使用相对地址(没有前导斜杠)。

总而言之,只要稍加思考,您就可以使您的配置在逻辑上与 Apache 提供的相同——这难道不比尝试以一种从未设计到产品中的方式在条件执行中搞砸更好吗?

于 2012-02-09T17:56:54.817 回答
0

您还需要通过为您的虚拟主机配置添加以下内容来确保.htaccess实际使用该文件:

DocumentRoot /var/www/html

<Directory /var/www/html>
AllowOverride All
# Other stuff
</Directory>

AllowOverride All指令可以.htaccess在每个目录的基础上覆盖文件中的配置指令。

于 2019-07-19T17:08:41.527 回答