.htaccess文件在Apache 2.4的Vagrant开发环境中无法使用

6
以下的.htaccess文件适用于各种托管网站,都在apache 2.2上运行,但测试环境和新的云服务器上运行的网站是在apache 2.4上运行。问题在于,除非添加完整的文件名(包括.php),否则无法访问php文件,例如www.example.com/about.php而不是www.example.com/about。非常感谢以下任何帮助 - 最好是一个.htaccess文件,适用于2.2和2.4 apache。
Options -Indexes +multiviews
RewriteEngine On
RewriteBase /

ErrorDocument 404 /404.php
#ErrorDocument 500 /500.php

# Add www.
RewriteCond %{HTTP_HOST} !^www\.
#RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

# Remove .php
#RewriteCond %{THE_REQUEST} ^GET\ (.*)\.php\ HTTP
#RewriteRule (.*)\.php$ $1 [R=301]

# remove index
RewriteRule (.*)/index$ $1/ [R=301]

# remove slash if not directory
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} /$
RewriteRule (.*)/ $1 [R=301]

# add .php to access file, but don't redirect
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteCond %{REQUEST_URI} !/$
RewriteRule (.*) $1\.php [L]

以下是用于虚拟主机的Apache 2.4 000-default.conf文件:
php_value auto_prepend_file /vagrant/www/fixdocroot.php

<VirtualHost *:80>
   ServerName dev.dev
   ServerAlias *.dev
   UseCanonicalName Off

   VirtualDocumentRoot "/vagrant/www/%-2+/public_html"

   <Directory /vagrant/www>
       AllowOverride All
       Require all granted
   </Directory>
</VirtualHost>

--- 进一步编辑 --- Apache错误日志如下:
[Mon Jan 11 09:26:35.751982 2016] [core:notice] [pid 1812] AH00094: Command line: '/usr/sbin/apache2'
[Mon Jan 11 09:44:22.816423 2016] [:error] [pid 1892] [client 192.168.33.1:49762] PHP Deprecated:  Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be removed in a future version. To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead. in Unknown on line 0, referer: http://speechlink-primary.dev/infant/assessment/start/15
[client 192.168.33.1:49804] AH00687: Negotiation: discovered file(s) matching request: /vagrant/www/domainname/public_html/page-name (None could be negotiated).

可能 .htaccess 被禁用了,请检查 Apache 配置。 - Max P.
1
抱歉,不用了,但还是谢谢! - brianlmerritt
您的 .htaccess 文件中的每个语句都被忽略了吗,还是只有某些语句被忽略了?(例如,您的 404 页面是否可以正常工作?)此外,Apache 错误日志中是否有错误? - Ferrybig
看起来 .htaccess 正在运行,404 重定向也正常工作,问题似乎出现在 Apache 2.2 和 2.4 处理 .php 重写方面。 - brianlmerritt
3个回答

5
升级apache 2.2到2.4时可能会出现一些问题。
忘记启用模块
有时候,您可能会忘记在新服务器上启用已使用的模块,只需运行apache命令a2enmod <module>即可解决。您在.htaccess中使用了rewrite模块,可以通过a2enmod rewrite激活它。
您使用的配置参数已更名
在apache 2.4中,某些配置参数的名称发生了更改。
根据apache更新说明,以下内容已更改: AllowOverride现在默认为None 有关此更改的详细信息,请参见@Gal's answer
新服务器上可能未安装/启用PhP
虽然我怀疑这可能不是问题,但我还是包括了它,因为这可能是其他人的问题。

通过创建一个包含代码<?PHP phpinfo()的phpinfo()文件并运行它,可以检查php是否已正确安装,并应该在运行时输出正确的php信息。

可以使用以下命令在apache上激活php:a2enmod php5a2enmod php7

RewriteRule日志记录

如果重写规则一直失败,可以快速测试启用重写规则日志记录,这可以使用默认的apache“LogLevel”启用,为了防止我们整个apache发出调试消息,同时仍然从重写模块获取调试消息,需要使用其名称作为前缀。例如:

LogLevel alert rewrite:trace3

这将打开重写级别的调试信息,以trace3跟踪,您可以升至lvl trace8

重写模块的调试信息可按以下方式读取:

[rewrite:trace2][rid#7f9c446360a0/initial] init rewrite engine with requested uri / - 这意味着重写引擎已经为一个url启动

[rewrite:trace3][rid#7f9c446360a0/initial] applying pattern '^.*$' to uri '/' - 这意味着RewriteRule已经生效

[rewrite:trace4][rid#7f9c446360a0/initial] RewriteCond: input='/' pattern='^/?projects/old-projects/' => not-matched - 这意味着RewriteCond未匹配。

[rewrite:trace4][rid#7f9c446360a0/initial] RewriteCond: input='/' pattern='^/?' => matched - 这意味着RewriteCond已经匹配。

[rewrite:trace2][rid#7f9c446360a0/initial] rewrite '/' -> '/index.html' - 一条 RewriteRule 将您内部/外部重定向到另一个页面。

阅读调试日志文件的最佳方法是使用不换行的文本编辑器,例如在 Linux 上使用 less -R 或在 Windows 上使用记事本。


刚刚仔细检查了一遍,重写已经启用并且正常工作,PHP也是如此,文件访问和重写也没有问题。问题仅仅是如果只有主文件名而没有扩展名,例如http://www.example.com/test应该加载test.php文件,但无法正确加载PHP文件。 - brianlmerritt
1
如果那个方法不行的话,那就没有别的办法了哈哈 :) - Gal Silberman
抱歉,刚刚注意到了编辑。我会检查并回来的。 - brianlmerritt

3

.htaccess文件的第一行似乎是问题所在:

Options -Indexes +multiviews

Apache文档中得知:
MultiViews的作用如下:如果服务器收到对/some/dir/foo的请求,如果/some/dir启用了MultiViews,并且/some/dir/foo不存在,则服务器读取目录以查找名为foo.*的文件,并实际上伪造一种类型映射,其中命名所有这些文件,将它们分配与客户端请求某个文件时相同的媒体类型和内容编码。然后选择最佳匹配客户端的要求。
我认为这可能会干扰RewriteRules - 我在Apache 2.4 vagrant盒子上的测试中,从该行中删除+multiviews似乎解决了这个问题。

1
太好了 - 终于解决了!必须重新查看文档,看看为什么首先启用它。 - brianlmerritt

3
我正在研究您的问题,因为我的服务器也有相同的问题。我找到了一种有效的解决方法。从Apache文档中 升级到2.4版本时 可以看到:

Errors serving requests:

.htaccess文件无法处理 - 检查是否存在适当的AllowOverride指令;在2.4中默认值更改为None。

这意味着AllowOverride的默认值已从“全部”更改为“无”。

默认值: AllowOverride None(2.3.9及更高版本), AllowOverride All (2.3.8及以下版本)

因此,要解决此问题,您需要更改httpd.conf文件 (或者apache2.conf),在Directory块中添加AllowOverride All。它不会影响2.2上的任何行为,并将修复2.4上的问题。
您可以在这个很好的帖子中查看如何更改Directory块并添加AllowOverride All的更多信息。
希望这能帮助您。

嗨,Gal - 我没有忽略你,但我需要在周一上班后尝试这个。 - brianlmerritt
当然,祝您周末愉快。 - Gal Silberman
1
嗨Gal,很抱歉告诉你配置文件已经包含了你的建议。如果你还有其他想法,我已经发布了实际的Apache .conf文件。 - brianlmerritt
我认为这仍然是问题。你的目录标签是:<Directory /vagrant/www> 应该改为 <Directory "/vagrant/www/domainname/public_html"> - Gal Silberman
VirtualDocumentRoot应该可以解决这个问题。如果我添加每个域名的实际文档根目录/vagrant/www/eachdomain.com/publichtml,那么所有的重写仍然有效,除了文件名到filename.php。 - brianlmerritt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接