.htaccess for apache 2.2 不适用于 apache 2.4 vagrant 开发框

Posted

技术标签:

【中文标题】.htaccess for apache 2.2 不适用于 apache 2.4 vagrant 开发框【英文标题】:.htaccess for apache 2.2 doesn't work on apache 2.4 vagrant development box 【发布时间】:2016-04-11 20:04:31 【问题描述】:

下面的 .htaccess 文件适用于各种托管网站,都在 apache 2.2 上,但云服务器上的测试环境和新网站在 apache 2.4 上运行。

问题在于,除非添加包括 .php 在内的完整文件名,否则对 php 文件的访问不再有效,例如www.example.com/about.php 而不是 www.example.com/about

非常感谢您对以下内容的任何帮助 - 理想情况下,使用适用于 2.2 和 2.4 apache 的 .htaccess。

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]

---编辑---

下面是用于 VirtualHost 的 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配置 抱歉,没有启用但谢谢! 您的 .htaccess 中的每个语句都被忽略了,还是只忽略了一些? (例如,您的 404 页面是否有效?)另外,apache 错误日志中是否有错误? .htaccess 似乎正在运行,404 重定向有效,问题似乎在 apache 2.2 和 2.4 之间处理 .php 重写 【参考方案1】:

我正在调查你的问题,因为我在我的服务器上遇到了同样的问题。

我找到了一个可行的解决方案。来自 Apache 文档,when upgrading to 2.4 from 2.2:

服务请求时出错:

.htaccess 文件没有被处理 - 检查适当的 AllowOverride 指令;在 2.4 中默认更改为无。

表示AllowOverride的默认值已经从All改为None

默认值:AllowOverride None(2.3.9 及更高版本)、AllowOverride All(2.3.8 及更早版本)

因此,要解决此问题,您需要更改您的httpd.conf 文件(或apache2.conf),将AllowOverride All 添加到您的Directory 块中。它不会改变 2.2 上的任何行为,并会在 2.4 上解决您的问题。

您可以查看有关如何更改 Directory 块并在 this 漂亮的小线程中添加 AllowOverride All 的更多信息。

希望对您有所帮助。

【讨论】:

嗨,Gal - 不要忽视你,但我周一上班时需要试试这个 当然。周末愉快。 嗨 Gal,很抱歉配置已经有你的建议。如果您有其他想法,我已经发布了实际的 apache .conf 我认为这仍然是问题所在。你的目录标签是:&lt;Directory /vagrant/www&gt;应该是&lt;Directory "/vagrant/www/domainname/public_html"&gt; VirtualDocumentRoot 应该解决这个问题。如果我添加每个域的实际文档根/vagrant/www/eachdomain.com/publichtml,那么除了文件名到 filename.php 之外,所有重写仍然有效【参考方案2】:

从 apache 2.2 升级到 2.4 时可能会出现一些问题

忘记启用模块

有时,您可能忘记在新服务器上启用已使用的模块,这可以通过运行 apache 命令a2enmod &lt;module&gt; 轻松解决,您在.htaccess 中使用模块rewrite,这可以通过@ 激活987654326@.

你使用的配置参数被重命名

在 apache 2.4 中,配置参数的名称有一些变化。

根据apache update notes,做了以下改动:

AllowOverride 现在默认为None

有关此更改的更多信息,请参阅@Gal's answer。

PhP 可能未在新服务器上安装/启用

虽然我怀疑这可能是这种情况,但我将其包括在内,因为这对其他人来说可能是个问题。

通过创建一个 phpinfo() 文件检查 php 是否正确安装,该文件包含 &lt;?PHP phpinfo() 并且在运行时应该给出正确的 php 信息。

可以在 apache 上激活 PHP:a2enmod php5a2enmod php7

重写规则日志记录

如果重写规则一直失败,快速测试可能会启用rewrite rule logs,这些可以使用默认的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/' =&gt; not-matched - 这意味着 RewriteCond 不匹配。

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

[rewrite:trace2][rid#7f9c446360a0/initial] rewrite '/' -&gt; '/index.html' - RewriteRule 已在内部/外部将您重定向到另一个页面

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

【讨论】:

刚刚经过仔细检查,重写已经启用并且工作正常,就像 php 一样,访问文件和重写也是如此。如果只是没有扩展名的主名称,则问题只是无法正确加载 php 文件,例如http://www.example.com/test 应该加载 test.php @ferrybig 如果这不起作用,什么都不会哈哈 :) 抱歉,刚刚注意到编辑。会检查并回来【参考方案3】:

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

Options -Indexes +multiviews

来自Apache documentation:

MultiViews 的效果如下:如果服务器收到对 /some/dir/foo 的请求,如果 /some/dir 启用了 MultiViews,并且 /some/dir/foo 不存在,则服务器读取目录查找名为 foo.* 的文件,并有效地伪造了一个类型映射,该类型映射为所有这些文件命名,为它们分配相同的媒体类型和内容编码,如果客户端按名称要求其中之一。然后它会选择最符合客户要求的匹配项。

我相信这会干扰 RewriteRules - 在我对 Apache 2.4 vagrant box 的测试中,从该行中删除 +multiviews 似乎已经解决了问题。

【讨论】:

太棒了——成功了!必须回顾文档以了解为什么首先启用它

以上是关于.htaccess for apache 2.2 不适用于 apache 2.4 vagrant 开发框的主要内容,如果未能解决你的问题,请参考以下文章

apache 2.2 (ubuntu) 不允许我通过.htaccess 设置php 错误报告?

Apache 2.2:“客户端被服务器配置拒绝” - .htaccess 密码保护

apache_conf .htaccess for SlimPHP API允许授权标头

Apache 升级 2.2 -> 2.4 问题

mod_rewrite 的问题 // Apache 2.2 // OpenSUSE 11.3

apache_conf [linux:.htaccess] apache的htaccess说明。 #linux #apache