.htaccess for apache 2.2没有;我不在apache2.4流浪者开发箱上工作


.htaccess for apache 2.2 doesn't work on apache 2.4 vagrant development box

下面的.htaccess文件适用于各种托管网站,都在apache2.2上运行,但测试环境和云服务器上的新网站都在apache2.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 24000-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).

从apache 2.2升级到2.4 时,可能会出现一些错误

忘记启用模块

有时,您可能会忘记在新服务器上启用已使用的模块,这可以通过运行apache命令a2enmod <module>轻松解决,您正在使用.htaccess中的模块rewrite,这可以由a2enmod rewrite激活。

您使用的配置参数将被重命名

在apache2.4中,配置参数的名称有一些更改。

根据apache更新说明,以下内容发生了更改:

AllowOverride现在默认为None

有关此更改的更多信息,请参阅@Gal的回答。

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

虽然我怀疑这可能是事实,但我也包括在内,因为这可能是其他人的问题。

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

Php可以在apache上使用:a2enmod php5a2enmod php7 激活

重写规则日志记录

如果重写规则一直失败,快速测试可能会启用重写规则日志,这些日志可以使用默认的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'-重写规则已从内部/外部将您重定向到另一个页面

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

.htaccess文件的第一行似乎有问题:

Options -Indexes +multiviews

来自Apache文档:

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

我认为这会干扰RewriteRules——在我对Apache 2.4流浪箱的测试中,从该行中删除+multiviews似乎已经解决了问题。

我正在调查您的问题,因为我的服务器上也有同样的问题。

我找到了一个有效的解决方案。从Apache Docs,当从2.2升级到2.4时:

提供请求时出错:

.htaccess文件未被处理-请检查相应的AllowOverride指令;默认值在2.4中更改为"无"。

这意味着AllowOverride的默认值已从All更改为None

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

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

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

希望这对你有帮助。