私のウェブサイトには複数のCGI(コンパイルされた実行可能バイナリからインポートされたもの)があります。氏場合に備えてソース)はブラウザ(例:
http://mydomain.com/cgi-bin/myprog.cgi )で実行するとうまく動作します
が、myprog.cgiへのシンボリックリンクをcgi-bin/
cd cgi -bin/
ln -s myprog.cgi proglink.cgiその後、
ブラウザで
http://mydomain.com/cgi-bin/proglink.cgiを実行しようとすると、
500エラーが発生します。
私の.htaccessには
AddHandler cgi-script .cgi
Options +ExecCGI +FollowSymLinks -Indexes
(+FollowSymLinksの有無にかかわらず+SymLinksIfOwnerMatchも試しましたが)動作しないようです。
編集するサイトにすでに長年にわたってうまく機能している.phpスクリプトへのシンボリックリンクがあることに注意する必要があります(下記のコメントの提案について@slmに感謝します)。 (PHPスクリプトは$ _SERVER [ 'PHP_SELF']を実行してシンボリックリンクの名前を返し、すべて問題なく動作します。)しかし、上記のように実行可能なimage.cgiへのシンボリックリンクは失敗します。
また、サイトが共有ホスティング(手頃な価格のdreamhost.com共有ホスティング)にあることにも言及する必要があるようです。
問題をインターネットで検索すると、何も機能しません。Apacheは、単にシンボリックリンクが指すCGIを実行しないことを示しています。インターネット検索は正しいですか、またはシンボリックリンク後にcgiを実行する方法はありますか?それが正しいがこれを行うことができない場合は、以下でこれを行う理由を説明します。その後、同じ一般的な目的を達成し、効果的な代替戦略を思い付くことを願っています。 ..
...だからこれだ安全次のラベルが表示されます。これらのCGIのいくつかは私のサイトに対するDDoS攻撃のターゲットになりました(誰かが私のサイトを悩ませる理由を神が知っているかわからない場合でも、それはまったく価値がありません)。そのため、各cgiにコードを追加して(各cgiのコードはほぼ同じです)、?query_stringを検証し、「攻撃可能性」スコアを割り当てました。スコアが小さい場合、cgi はリクエストを無視し、スコアが大きいと、ユーザーの ipaddr=getenv("REMOTE_ADDR") が "deny from" とともに .htaccess に自動的に追加されます。メールでお知らせするなど、さまざまな中間措置もあります。
だからこれは多くのコード行になります。私は各CGIに個別にコンパイルするのではなく、設定後に忘れてしまうフロントエンドクエリ検証を書くことを望みました(そしてまだ欲しい)。その後、すべてが正常な場合は、system()呼び出しを実行して要求されたcgiを実行します。だから私はsystem()呼び出しを発行して間接的にcgiを実行する短くて小さなテストプログラムを書いていましたが、うまくいきました。
シンボリックリンクの問題が発生する理由は、通常、フロントエンドがさまざまなcgiを実行できる必要があるため、どのcgiを実行するかを知る必要があるためです。各cgi名を対応するフロントエンドcgiにシンボリックリンクすることでgetenv( "SCRIPT_NAME")を解決できます。これはシンボリックリンク名を指定して要求する特定のcgiを識別します。 PHP $_SERVER['PHP_SELF'] と少し似ています。したがって、シンボリックリンクが最もクリーンでシンプルなソリューションのようです。しかし、これがapache / .htaccessで可能でない場合は、同じ結果を得るための別の方法を提案できますか?