ホストされているサイトがあり、Joomlaの構成に問題があります(IIS7 + win server2008でJoomla + php + mySQLを実行しています)。ローカルマシン(IIS7 + Vistax64上のJoomla + php + mySQL)で同様の構成を実行しているので、少なくとも、これを設定する方法についてさまざまなチュートリアルに示されている手順に従うことができました。
ホストされているサイトでのこの症状は、JoomlaでSEO設定をオンにできないことです(最初の設定である「検索エンジンに適したURL」でさえも)。 404(ファイルが見つかりません)を取得するか、URLが正しく書き換えられたように見えますが、表示されるのは常にホームページのコンテンツです。自宅のマシンでも同様の問題が発生しましたが、PHPをホストするためにFastCGIを使用していなかったことが原因であることが判明したため、ホストされたサイトで調査することにしました。
とにかく、私はホストされたサイトのjoomlaをホストしているディレクトリのweb.configファイルで次の行に気づきました:
<add name="Plesk_Handler_3522909676" path="*.php" verb="*" modules="IsapiModule" scriptProcessor="c:\program files (x86)\parallels\plesk\additional\pleskphp5\php5isapi.dll" resourceType="Either" />
過去の経験から、fastCGIで実行していない場合、phpにはいくつかの問題があることがわかっています。ルートフォルダのweb.configが代わりに次の行を使用していることに気づきました。
<add name="Plesk_Handler_0286090609" path="*.php" verb="*" modules="CgiModule" scriptProcessor="c:\program files (x86)\parallels\plesk\additional\pleskphp5\php-cgi.exe" resourceType="Either" />
私はそれをjoomlaディレクトリのweb.configにコピーし、異なる動作をしました...しかしそれでも機能しません。 phpInfo()を実行するjoomlaディレクトリに.phpファイルをロードすると、サーバーAPIの下にCGI/FastCGIと表示されます。それは肯定的な確認 FastCGIが使用されているということですか? Web構成のハンドラーがmodules = "FastCgiModule"ではなくmodules = "CgiModule"を指すのはなぜですか(それが存在するかどうかはわかりませんが、CgiModuleについての言及が疑わしいと思います)。
これはホストされたサイトです。私が知る限り、ApplicationHost.configファイルにアクセスできません...
簡単なテストは次のとおりです。
<?php phpinfo(); ?>
内部;
Phpinfoの出力を確認し、_SERVER ["REQUEST_URI"]を探します。
この変数が欠落している場合は、CGIが使用されます。変数が存在し、/ phpinfo.php/foobar?foo = barに正しく設定されている場合は、ISAPIまたはFastCGIのいずれかが使用されます。サーバーAPIの出力の上部近くを見てください。 ISAPI(ISAPIが使用されていることを意味します)またはCGI/FastCGI(すでにCGIを除外しているため、FastCGIが使用されていることを意味します)のいずれかに設定する必要があります。
(centosで)apachectl -Mを使用すると、有効になっているモジュールが表示されます。
apachectl -M:
file_cache_module(共有)mem_cache_module(共有)version_module(共有)fastcgi_module(共有)
php_sapi_name()またはPHP_SAPIは、どちらも機能します。
http://php.net/manual/en/function.php-sapi-name.php
<?php
if (php_sapi_name() != 'cgi-fcgi'){
echo 'I knew fastcgi wasn\'t working.';
}else{
echo 'Holy crap, something worked for once.';
}
残念ながら、_\_SERVER["REQUEST_URI"]
_のチェックはうまくいきませんでした。 [〜#〜] cgi [〜#〜]またはFastCGIを使用すると、常に_/phpinfo.php/foobar?foo=bar
_が表示されます。
_Server API = CGI/FastCGI
_が設定されているかどうかもわかりませんでした。これは、コンパイルされたバージョンのphpがサポートするインターフェースのみを示し、使用されているものは示しません。ただし、より確実に機能する可能性のある別の方法を見つけました。
phpinfo.phpというテキストを含むファイルを所定の場所に配置します:<? php phpinfo(); ?>
変数_\_ENV["REDIRECT_HANDLER"]
_を確認します。
それが_php5-fastcgi
_(または他のfastcgi-ish)に設定されている場合、要求はおそらくFastCGIを通過しました。 _application/x-httpd-php
_に設定されている場合(または上記以外のものを想定している場合)、[〜#〜] cgi [〜#〜]を使用しています。
ただし、確実な方法は、少しテストを実行することです。これにはab
(Apache Bench)ツールが必要です。
CGIの有無にかかわらず、これを別のマシンから実行します。
_ab -c 100 -n 1000 http://yourdomain.com/path/phpinfo.php
_
行_Time taken for tests:
_を確認してください。少なくとも私のボックスでは、1.3MbpsのADSL接続を介してVPSにアクセスすると、FastCGIはそれを完全に使い果たしましたが、CGIでは半分しか満たすことができませんでした。
お役に立てれば。
これは私のために働いた。
/**
* return phpinfo() results as an array
*
* @credit http://php.net/manual/en/function.phpinfo.php#106862
* @param void
* @return array
*/
function phpinfo_array(){
ob_start();
phpinfo();
$info_arr = array();
$info_lines = explode("\n", strip_tags(ob_get_clean(), '<tr><td><h2>'));
$cat = 'general';
foreach($info_lines as $line){
preg_match('/<h2>(.*)<\/h2>/', $line, $title) ? $cat = preg_replace('/\s+/', '_', strtolower(trim($title[1]))) : null;
if(preg_match('/<tr><td[^>]+>([^<]*)<\/td><td[^>]+>([^<]*)<\/td><\/tr>/', $line, $val)){
$subcat = preg_replace('/\s+/', '_', strtolower(trim($val[1])));
$info_arr[$cat][$subcat] = $val[2];
} elseif(preg_match('/<tr><td[^>]+>([^<]*)<\/td><td[^>]+>([^<]*)<\/td><td[^>]+>([^<]*)<\/td><\/tr>/', $line, $val)){
$subcat = preg_replace('/\s+/', '_', strtolower(trim($val[1])));
$info_arr[$cat][$subcat] = array('local' => $val[2], 'master' => $val[3]);
}
}
return $info_arr;
}
// output proper response code
$phpinfo = phpinfo_array();
$configure = (@isset($phpinfo['general']['configure_command'])) ?: null;
// properly account for FastCGI
if ($configure && preg_match('/--enable-fastcgi/', $configure)){
// fastcgi response
header('Status: 403 Access is forbidden');
} else {
// http response
header('HTTP/1.0 403 Access is forbidden');
}
あなたはそれへの参照を見るはずです
<?php
phpinfo();
?>
サーバーAPI = CGI/FastCGI
Fastcgiが実行されていないときにスクリプトが完全に失敗する場所に、最初に設定されていることを確認してください。そうすれば、それが機能するとき、fastcgiデーモンが理由であることがわかります。