繁体   English   中英

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

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

下面的.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]

- -编辑 - -

下面是用于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).

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

忘记启用模块

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

您重命名的配置参数已重命名

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

根据apache更新说明 ,以下内容已更改:

AllowOverride现在默认为None

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

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

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

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

Php可以在apache上激活: 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 [rewrite:trace4][rid#7f9c446360a0/initial] RewriteCond: input='/' pattern='^/?' => matched - 这意味着RewriteCond已匹配。

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

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

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

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

提供请求的错误:

.htaccess文件未被处理 - 检查适当的AllowOverride指令; 2.4中的默认值更改为“无”。

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

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

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

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

希望能帮到你。

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

Options -Indexes +multiviews

Apache文档

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM