父目录中的 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 onOptions +FollowSymlinks -Indexes 以及一些非常标准的重写规则和条件。 RewriteOptions InheritXXXX 既不在任何 .htaccess 文件中,也不在 httpd_server_app.conf 中。 如果您“删除” 子域 的 .htaccess,您还会收到此错误吗? (授予您的网站可能无法正常工作。)我认为我们可能需要查看您的 .htaccess 文件(以排除明显的,如果有的话)。什么版本的 Apache? 您是否以任何方式解决了问题? “我已经确认父域站点和子域站点都配置了AllowOverride All” - 但是AllowOverride All 指令具体设置在哪里?如果AllowOverride All 仅在父域的 VirtualHost 中设置,那么您还需要在子域自己的(隔离的)VirtualHost 中重新声明它。 【参考方案1】:

自从更新到 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)

【讨论】:

【参考方案2】:

刚刚遇到同样的问题(在最近更新 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>

这应该可行!

【讨论】:

以上是关于父目录中的 htaccess 导致“此处不允许 RewriteEngine”的主要内容,如果未能解决你的问题,请参考以下文章

htaccess 文件影响父目录

使用 .htaccess 拒绝访问目录中的所有 PHP 文件

htaccess 中的 AddType 导致页面下载

[单选题].htaccess文件提供了针对每个目录改变配置的方法,但启用.hatccess都会导致服务器的性能下降,以及会导致一些不安全的因素。在下面的指令中,哪一个可以禁止在目录下使用该文件?

htaccess - RewriteRules 声明导致 404 错误

.htaccess 文件在 localhost 上导致错误