変数に基づいてssiインクルードを動的に追加していますが、ファイルが存在しない場合に備えて、デフォルトのインクルードを使用できるようにしたいと思います。すなわち:
if /file/testthisfile.ssi exists
add /file/testthisfile.ssi
else
add /file/default.ssi
これは可能ですか?
ありがとう!
変数に基づいてssiインクルードを動的に追加していますが、ファイルが存在しない場合に備えて、デフォルトのインクルードを使用できるようにしたいと思います。すなわち:
if /file/testthisfile.ssi exists
add /file/testthisfile.ssi
else
add /file/default.ssi
これは可能ですか?
ありがとう!
いいえ-私はその答えを恐れていました。しかし、将来この質問に出くわす可能性のある人のために、私は単純なケースの回避策を見つけました。エラーメッセージを編集して、私の場合は画像を出力できます。
<!--#config errmsg="<img src='/file/testthisfile.jpg' alt='' />" -->
したがって、ファイルが存在しない場合は、デフォルトを設定できます。
これは単純な場合にのみ機能することを強調する必要がありますが、これはちょっとした回避策です。
実際にはここでの答えとは反対に、SSIは実際にファイル存在テストをサポートしています。これは構文です
<!--#if expr="-A /private" -->
Click <a href="/private">here</a> to access private information.
<!--#endif -->
-Aフラグのサポートは、apache構成で有効にする必要がある場合があります。
SSIのこのスポットで使用される式は、ここに記載されているapache式モジュールに分解されています。
http://httpd.apache.org/docs/current/expr.html
ただし、-Aフラグは、「レガシー」SSI式パーサーでも使用できます。
これについてはしばらく考えていましたが、確かにahgoodは正しかったのですが、SSIにはファイル検出機能が組み込まれていないため、フロー制御が制限されています。
余談ですが、SSIの拡張バージョン(VMSベースのシステム)への参照を見つけました
http://wasd.vsm.com.au/doc/env/env_0400.html
また、ある種の方法でファイルの存在を確認できる拡張機能がいくつかありました。
ただし、多くの場合、SSIを使用している場合は、おそらくLAMP環境で実行されているため、includeステートメントでCGI/PHPスクリプトを実行するSSIの機能を利用できます。
あまり問題なく、次のことに頼ることができます。
<body>
<!--#include virtual="insert_intro.html" -->
<h2>Insert An Existing File</h2>
<!--#include
virtual='checkFileExists.php?fn=insert_help.html&df=insert_default.html' -->
<h2>Insert a Non-Existing File</h2>
<!--#include
virtual='checkFileExists.php?fn=insert_no_help.html&df=insert_default.html' -->
</body>
これは、PHPスクリプトを使用してすべてのファイルチェックを実行します。
<?php
$theFileName = $_GET['fn'];
$theDefault = $_GET['df'];
if ( file_exists($theFileName) === TRUE ) {
include($theFileName);
} else {
include($theDefault);
}
?>
目的のファイルとバックアップ/デフォルトファイルの2つのファイル名を渡します。スクリプトは最初のファイルをチェックし、見つからない場合は2番目のファイルを使用します。
このアプローチは疑問を投げかけます、PHPが利用可能であるのになぜSSIを使うのですか?場合によっては、特にレガシーシステムでは、SSIに基づく大きなWebサイトが存在する可能性があり、回避策はエレガントではありませんが、問題を解決します。
PHPは必須ではなく、PERLスクリプトも機能します。
最後に、PHPを使用して実験しましたapache_setenv
が、PHP、Apache、およびSSI間で環境変数を渡す方法がわかりませんでした($_SERVER変数と$_ENV変数も設定しようとしましたが、成功しませんでした)。
SSIはファイル検出をサポートしていません。
Apache 2.4を実行していると仮定すると、-Fオプションを使用できます(引用符に注意してください)。
<!--#if expr='-F "/private"' -->
Click <a href="/private">here</a> to access private information.
<!--#endif -->
ドキュメント(http://httpd.apache.org/docs/current/expr.html)から:
文字列が有効なファイルであり、そのパスに対してサーバーで現在構成されているすべてのアクセス制御を介してアクセスできる場合はTrue。これは内部サブリクエストを使用してチェックを行うため、注意して使用してください。サーバーのパフォーマンスに影響を与える可能性があります。
この例を機能させるには、Apacheユーザーがテストしているディレクトリ/フラグにアクセスする必要があります。.htaccessまたはhttpd.confファイルで次のものが必要になる場合もあります。
<Directory /private>
Require all granted
</Directory>
あなたはこのようにそれを行うことができます:
<!--#include virtual="/file/testthisfile.ssi" onerror="/file/default.ssi" -->
「-F」単項演算子、および「-A」単項演算子は、パスのアクセス可能性のみを参照し、リソースの実際の存在を参照しないことに注意してください。
ここを見てください:http://httpd.apache.org/docs/2.4/expr.html(単項演算子)。
このようなタスクを実行する演算子(-e、-s、-f)は、mod_includeでは使用できません。