【问题标题】:mod_rewrite in <Location /> in apache conf causing rewrite in .htaccess file not to work?apache conf 中 <Location /> 中的 mod_rewrite 导致 .htaccess 文件中的重写不起作用?
【发布时间】:2011-07-12 23:32:13
【问题描述】:

我正在使用 zend 框架,它有一个漂亮的示例 .htaccess 用于将不存在的位置重定向到 index.php 以由框架处理:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ /site/index.php [NC,L]

这里是 /site 的 apache 配置

Alias /site "/path/to/zf/project/public"
<Directory "/path/to/zf/project/public">
    Options Indexes MultiViews FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>

在我们升级站点时,我想将所有流量重定向到特定文件(例如,offline.html),但特定 IP(例如 127.0.0.1)除外,因此我尝试使用此规则在 apache 配置中:

<Location />
    Options Indexes MultiViews FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all

    RewriteEngine On
    RewriteBase /
    RewriteCond %{REMOTE_HOST} !^127\.0\.0\.1
    RewriteCond %{REQUEST_URI} !/offline\.html$
    RewriteRule .* /offline.html [R=302,L]
</Location>

这似乎可行,但由于某种原因,它使我的 .htaccess 文件似乎无法正常工作。我可以很好地访问 /site,但我不能更深入地访问,例如 /site/controller/action。

谢谢!

【问题讨论】:

    标签: apache zend-framework .htaccess mod-rewrite


    【解决方案1】:

    Apache 2.2Apache 2.4 documentation of mod_rewrite 明确指出应避免在&lt;Location&gt; 指令中重写规则。 Apache 2.0 documentation 中未包含此警告。

    尽管&lt;Location&gt;&lt;Files&gt; 部分(包括它们的正则表达式对应项)在语法上允许重写规则,但这绝不是必需的并且不受支持。在这些情况下可能会破坏的一个特征是相对替换。

    所以奇怪的事情会发生。您可以删除&lt;Location&gt; 部分(和RewriteBase 指令),并直接在&lt;VirtualHost&gt; 定义中使用这些新的重写规则,而无需任何&lt;Directory&gt;&lt;Location&gt; 部分。它甚至更快。

    全局级别重写规则的唯一问题是您还没有计算出REQUEST_FILENAME(您可以稍微修改一下,但在这里您甚至不需要REQUEST_FILENAME)。

    您的RewriteRule 中还有一个错误,您使用了重定向,因此重写规则应该使用绝对网址

    RewriteRule .* http://www.example.com/offline.html [R=302,L]
    

    关于维护页面,一个经典的处理方式是这两行:

    ErrorDocument 503 /htdocs/err/503.html
    RedirectMatch 503 ^/(?!err/)
    

    您没有过滤本地 IP,但有趣的是用于维护的代码是 503(暂时不可用),这更正确(实际上重定向 307 更正确,但旧浏览器可能会出现问题它)。对本地 IP 限制和 RewriteRule 执行相同操作将是:

    ErrorDocument 503 /offline.html
    RewriteCond %{REMOTE_HOST} !^127\.0\.0\.1
    RewriteCond %{ENV:REDIRECT_STATUS} !=503
    RewriteRule ^ - [L,R=503]
    

    【讨论】:

      【解决方案2】:

      要在 htaccess 文件中包含这些规则,当您想使用“离线模式”时,您必须手动添加/删除它们。

      通过应用程序执行此操作的更好方法是创建控制器插件。 如果APPLICATION_ENV = 'offline',插件会做_forward('offline', 'error', 'default');

      或者,您可以在 Zend_Controller_Action 的子类中编写逻辑,将其用作控制器的基类。

      【讨论】:

      • 我考虑过通过zend应用程序来做,但它比这要复杂一些。我需要将所有服务器流量重定向到offline.html,而不仅仅是将流量重定向到zend 框架站点(/site)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 2017-08-10
      • 1970-01-01
      • 2020-05-14
      • 2015-04-15
      • 1970-01-01
      相关资源
      最近更新 更多