[英]Apache2, php5-fpm - file extension not required
我已經使用PHP5-FPM(使用PHP 5.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
我仔細閱讀了文檔,對Google進行了徹底的搜索(除非我沒有使用正確的關鍵字),並檢查了apache和php的配置。 這在使用nginx和php5-fpm或apache和mod_php5的組合的實時服務器或開發服務器上不會發生
我的虛擬主機的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
- RewriteCond %{REQUEST_FILENAME} !-f
重寫有效 .php
文件-並非非PHP文件僅適用於擴展名。 嘗試更換:
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。*的文件,並有效地偽造了一個類型圖,該類型圖對所有這些文件進行了命名,為它們分配了與客戶端要求通過名稱提供的相同的媒體類型和內容編碼。 然后,它選擇最符合客戶要求的匹配項。
對我來說,這似乎是個大漏洞,有人認為這是一個功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.