apache conf中<Location />中的mod_rewrite导致.htaccess文件中的重写不起作用?

lak*_*nen 3 apache .htaccess mod-rewrite zend-framework

我正在使用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]
Run Code Online (Sandbox Code Playgroud)

这是/ 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>
Run Code Online (Sandbox Code Playgroud)

在升级站点时,我想将所有流量重定向到特定IP(例如127.0.0.1)之外的特定文件(例如offline.html),因此我尝试在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>
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

reg*_*ero 5

mod_rewriteApache 2.2Apache 2.4文档明确指出<Location>应避免使用伪指令中的重写规则。该警告未包含在Apache 2.0文档中

尽管在<Location><Files>节中(包括与它们的正则表达式对等物)在语法上允许使用重写规则,但这永远是没有必要的,不受支持。在这些情况下可能打破的特征是相对替换。

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

全局级别重写规则的唯一问题是您REQUEST_FILENAME尚未进行计算(可以修改一下,但在这里甚至不需要REQUEST_FILENAME)。

您还存在一个错误RewriteRule,您使用重定向,因此重写规则应使用绝对网址

RewriteRule .* http://www.example.com/offline.html [R=302,L]
Run Code Online (Sandbox Code Playgroud)

关于维护页面,经典的处理方法是使用以下两行:

ErrorDocument 503 /htdocs/err/503.html
RedirectMatch 503 ^/(?!err/)
Run Code Online (Sandbox Code Playgroud)

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

ErrorDocument 503 /offline.html
RewriteCond %{REMOTE_HOST} !^127\.0\.0\.1
RewriteCond %{END:REDIRECT_STATUS} !=503
RewriteRule ^ - [L,R=503]
Run Code Online (Sandbox Code Playgroud)