我使用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>
修改 我进一步调查了:
RewriteCond %{REQUEST_FILENAME} !-f
- 重写工作.php
文件没有扩展名 - 非php文件只能使用扩展程序。答案 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。*的文件,并有效地伪造一个类型地图 它命名所有这些文件,为它们分配相同的媒体类型和 如果客户要求其中一个,它将具有内容编码 他们的名字。然后它选择与客户的最佳匹配 要求。
对我而言,这似乎是个大漏洞,有些人认为这是一个特色。