父目录中的 htaccess 导致“此处不允许 RewriteEngine”
Posted
技术标签:
【中文标题】父目录中的 htaccess 导致“此处不允许 RewriteEngine”【英文标题】:"RewriteEngine not allowed here" caused by htaccess in parent directory 【发布时间】:2015-11-12 02:02:57 【问题描述】:目前我正在使用 OSX Server (Yosemite) 来托管一堆 php 应用程序,其中一些在网站文档根目录下有一个子目录,用于子域。自从更新到 OSX Server 的 Yosemite 版本后,这些子域一直抛出 500 错误,错误日志引用 RewriteEngine not allowed here
。
经过调查,我已经确认父域和子域站点都配置了 AllowOverride All
,并且 .htaccess 文件在非子域站点上运行。此外,我发现重命名或以其他方式从父目录中删除 .htaccess 文件会导致子域重新开始工作。
/original_site_doc_root <- doc root for regular site
.htaccess
index.php
...
subdomain/ <- configured as a seperate site in osx server as a subdomain
.htaccess
index.php
...
我所做的每一点谷歌搜索最终都是指确保 mod_rewrite
已安装并且 AllowOverride
配置正确。
我的问题是,如何让 Apache 停止在子域网站上抛出 500 错误?
编辑
这是导致我悲伤的子域的 .htaccess 文件(域、目录和页面经过模糊处理以保护无辜者)
RewriteEngine On
Options +FollowSymlinks -Indexes
RewriteCond %HTTP_HOST ^www\.m\.somesite\.com$ [NC]
RewriteRule ^(.*)$ http://m.somesite.com/$1 [L,R=301]
RewriteBase /
# supress php errors
php_flag display_startup_errors off
php_flag display_errors off
php_flag html_errors off
php_value docref_root 0
php_value docref_ext 0
# enable PHP error logging
php_flag log_errors on
php_value error_log /some/fuzzed/dir
RewriteRule ^$ /index.php [L]
RewriteRule ^home$ /home.php [L]
RewriteRule ^some-page1$ /some-page1.php [L]
RewriteRule ^some-page2$ /some-page2.php [L]
RewriteRule ^some-page3/(.*)$ /some-page32.php [L]
RewriteRule ^some-page3(\/?)$ /some-page32.php [L]
RewriteRule ^some-page4/(.*)$ /some-page4.php [L]
RewriteRule ^some-page4(\/?)$ /some-page4.php [L]
RewriteRule ^some-page5/(.*)$ /some-page5.php [L]
RewriteRule ^some-page5(\/?)$ /some-page5.php [L]
RewriteRule ^some-page6/(.*)$ /some-page6.php [L]
RewriteRule ^some-page6(\/?)$ /some-page6.php [L]
父目录/非子域站点的 .htaccess 或多或少相似,唯一真正相关的区别是前 2 行:
RewriteEngine On
Options +FollowSymlinks -Indexes -Multiviews
【问题讨论】:
您是否在任何地方使用RewriteOptions InheritXXXX
? 文件系统上的父目录的.htaccess文件被继承,虽然mod_rewrite不是正常的。
.htaccess 文件都有RewriteEngine on
和Options +FollowSymlinks -Indexes
以及一些非常标准的重写规则和条件。 RewriteOptions InheritXXXX
既不在任何 .htaccess 文件中,也不在 httpd_server_app.conf
中。
如果您“删除” 子域 的 .htaccess,您还会收到此错误吗? (授予您的网站可能无法正常工作。)我认为我们可能需要查看您的 .htaccess 文件(以排除明显的,如果有的话)。什么版本的 Apache?
您是否以任何方式解决了问题?
“我已经确认父域站点和子域站点都配置了AllowOverride All
” - 但是AllowOverride All
指令具体设置在哪里?如果AllowOverride All
仅在父域的 VirtualHost 中设置,那么您还需要在子域自己的(隔离的)VirtualHost 中重新声明它。
【参考方案1】:
刚刚遇到同样的问题(在最近更新 Apache2 之后)并找到了解决方案。
假设您的域为example.com
,目录为/var/www/example/
,并且您有一个名为api.example.com
的子域,目录为/var/www/example/api/
。
尝试使用以下内容:
<VirtualHost *:80>
ServerName api.example.com
DocumentRoot /var/www/example/api
<Directory /var/www/example/>
AllowOverride FileInfo Options
</Directory>
<Directory /var/www/example/api/>
Require all granted
Options +FollowSymLinks +MultiViews +ExecCGI -Indexes
AllowOverride all
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
这应该可行!
【讨论】:
【参考方案2】:自从更新到 OSX Server 的 Yosemite 版本后,这些子域一直抛出 500 错误,错误日志引用
RewriteEngine not allowed here
。
OS X 10.10 (Yosemite) 附带 Apache 2.4,而早期版本的 OS X 附带 Apache 2.2。这些版本之间的一个重要区别(可能会导致您出现问题)是,AllowOverride
在 Apache 2.2 中默认为 All
,在 Apache 2.4 中默认为 None
。 (参见Apache Docs)您可能依赖于这种默认行为。
我已确认父域和子域站点都配置了
AllowOverride All
但是AllowOverride All
指令到底设置在哪里?我假设父域和子域站点被配置为单独的虚拟主机。如果AllowOverride All
只设置在父域的VirtualHost 中,对于(子域的)“父目录”,那么当您访问子域时将看不到这个,这是一个完全独立的VirtualHost。您还需要在子域自己的(隔离的)VirtualHost 中重新声明它(如@benck 的回答)。
或者,如果您根本不希望处理父 .htaccess
文件,则在子域的 VirtualHost 中明确设置以下内容:
<Directory /var/www/example/>
AllowOverride None
AllowOverrideList None
</Directory>
.htaccess
文件沿文件系统路径工作,无论访问的主机如何。
或者,如果主域是在主服务器配置中配置的(即不在 VirtualHost 容器中),那么您不应该遇到这个问题,因为 VirtualHost 将继承服务器的配置。
参考:https://en.wikipedia.org/wiki/MacOS_Server#OS_X_10.10_(Yosemite_Server_4.0)
【讨论】:
以上是关于父目录中的 htaccess 导致“此处不允许 RewriteEngine”的主要内容,如果未能解决你的问题,请参考以下文章
使用 .htaccess 拒绝访问目录中的所有 PHP 文件
[单选题].htaccess文件提供了针对每个目录改变配置的方法,但启用.hatccess都会导致服务器的性能下降,以及会导致一些不安全的因素。在下面的指令中,哪一个可以禁止在目录下使用该文件?