Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache2,php5 fpm-不需要文件扩展名_Apache_.htaccess_Mod Rewrite_Php_Travis Ci - Fatal编程技术网

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

Apache2,php5 fpm-不需要文件扩展名,apache,.htaccess,mod-rewrite,php,travis-ci,Apache,.htaccess,Mod Rewrite,Php,Travis Ci,我已经使用PHP5-FPM(使用PHP5.3.27)和apache2设置了一个服务器 文档根目录中有一个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 Rewri

我已经使用PHP5-FPM(使用PHP5.3.27)和apache2设置了一个服务器

文档根目录中有一个
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>

DocumentRoot/var/www/html
ServerName admin.localhost
ServerAlias*.localhost
选项如下SYMLINKS多视图执行CGI
允许超越所有
命令拒绝,允许
通融
#连接Apache以使用Travis CI的php fpm。
AddHandler php5 fcgi.php
行动php5 fcgi/php5 fcgi
别名/php5 fcgi/usr/lib/cgi-bin/php5 fcgi
FastCgiExternalServer/usr/lib/cgi-bin/php5-fcgi-host 127.0.0.1:9000-pass-header-Authorization
编辑 我进一步调查了:

  • 如果我删除api.php,重写就可以了
  • 如果我删除
    RewriteCond%{REQUEST\u FILENAME}-f
    -重写工作正常
  • 任何
    .php
    文件在没有扩展名的情况下加载-非php文件只能使用扩展名
尝试更换:

Options FollowSymLinks MultiViews ExecCGI
作者:

MultiViews关键字来自mod_negocation,可能有很多副作用。其中一个效果是,它可以扫描已知的扩展名,当您请求“api”时,它可以扫描“api.php”或“api.html”文件,并在内部重定向这些文件上的请求

发件人:

多视图的效果如下:如果服务器收到 如果/some/dir启用了多视图,则请求/some/dir/foo,以及 /某些/dir/foo不存在,则服务器读取该目录 查找名为foo.*的文件,实际上伪造了一个类型映射 为所有这些文件命名,为它们分配相同的媒体类型和 如果客户要求其中一个 他们的名字。然后,它选择与客户的最佳匹配 要求

对我来说,这似乎是一个大洞,有人认为这是一个特点

Options FollowSymLinks -MultiViews ExecCGI