Apache2,php5-fpm - 不需要文件扩展名

时间:2014-04-09 17:07:32

标签: apache .htaccess mod-rewrite php travis-ci

我使用PHP5-FPM(使用PHP 5.3.27)和apache2设置了服务器。

doc根目录中有一个api.php文件,使用mod_rewrite我在.htaccess中有这个规则:

RewriteEngine on
RewriteRule ^api/rest api.php?type=rest [QSA,L]
RewriteCond %{REQUEST_URI} !^/(media|skin|js)/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule .* index.php [L]

所以我想要的是除了确切的文件匹配之外的所有内容都要传递给index.php

但是,当我转到/api/正在加载api.php时,而不是将请求转发到index.php

我已经浏览了文档,彻底搜索了(除非我没有使用正确的关键字),并检查了apache和php配置。在我们的实时服务器或使用nginx和php5-fpm或apache和mod_php5

的组合的开发服务器上不会发生这种情况。

我对vhost的Apache配置是:

<VirtualHost *:80>

  DocumentRoot /var/www/html

  ServerName admin.localhost
  ServerAlias  *.localhost

  <Directory "/var/www/html">
    Options FollowSymLinks MultiViews ExecCGI
    AllowOverride All
    Order deny,allow
    Allow from all
  </Directory>

  # Wire up Apache to use Travis CI's php-fpm.
  <IfModule mod_fastcgi.c>
    AddHandler php5-fcgi .php
    Action php5-fcgi /php5-fcgi
    Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
    FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -host 127.0.0.1:9000 -pass-header Authorization
  </IfModule>

</VirtualHost>

修改 我进一步调查了:

  • 如果我删除api.php - 重写工作
  • 如果我删除RewriteCond %{REQUEST_FILENAME} !-f - 重写工作
  • 他们加载的任何.php文件没有扩展名 - 非php文件只能使用扩展程序。

1 个答案:

答案 0 :(得分:1)

尝试更换:

Options FollowSymLinks MultiViews ExecCGI

人:

Options FollowSymLinks -MultiViews ExecCGI

MultiViews关键字来自 mod_negociation ,可能会产生很多副作用。其中一个影响是它可以扫描已知的扩展,当你请求'api'它可以扫描api.php'或'api.html'文件并在内部重定向这些文件的请求。

来自http://httpd.apache.org/docs/2.2/content-negotiation.html#multiviews

  

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

对我而言,这似乎是个大漏洞,有些人认为这是一个特色。