父目录

时间:2015-08-18 23:23:50

标签: apache .htaccess mod-rewrite

目前我正在使用OSX Server(Yosemite)来托管一堆PHP应用程序,其中一些在子域名的网站文档根目录下有一个子目录。自从更新到Yosemite版本的OSX Server以来,这些子域一直在抛出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或多或少相似,唯一真正的相关性差异是前两行:

RewriteEngine On
Options +FollowSymlinks -Indexes -Multiviews

2 个答案:

答案 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>

这应该有效!

答案 1 :(得分:0)

  

自从更新到优胜美地版本的OSX服务器以来,这些子域一直在抛出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中设置,则对于&#34;父目录&#34; (子域名),当您访问子域时,将不会看到这个,这是一个完全独立的VirtualHost。您需要在子域自己的(隔离的)VirtualHost中重新声明这一点(如在@benck的回答中)。

或者,如果您根本不想处理父.htaccess个文件,请在子域名的VirtualHost中明确设置以下内容:

<Directory /var/www/example/>
    AllowOverride None
    AllowOverrideList None
</Directory>
无论正在访问哪个主机,

.htaccess文件都沿着文件系统路径工作。

或者,如果主域配置在主服务器配置中(即不在VirtualHost容器中),那么您不应该遇到此问题,因为VirtualHost将继承服务器的配置。 / p>

参考:
https://en.wikipedia.org/wiki/MacOS_Server#OS_X_10.10_(Yosemite_Server_4.0)