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。
谢谢!
mod_rewrite的Apache 2.2和Apache 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)