米Godaddy の Shared Linux Hostingで PATH_INFO を必要とするPHPスクリプトを動かす方法。

  • Godaddyの担当者を今すぐLANケーブルで首吊らせたいです。マジで。

PATH_INFOやらAcceptPathInfoが徹底的に無効化されているGoDaddyでPATH_INFOを使う方法です。

  1. .htaccess に以下の追記をする。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,E=PATH_INFO:$1]
</IfModule>
  • いわずとしれた、存在しないファイルを index.php にリダイレクトするRewriteRuleです。
  • ミソはフラグで、
    • QSA - クエリ部分を末尾に追記する
    • E=PATH_INFO:$1 - $1 に該当する部分を環境変数 REDIRECT_PATH_INFO に代入する。

あとはスクリプト側で以下をやるだけです。

if (isset($_SERVER['REDIRECT_PATH_INFO'])) {
        $_SERVER['PATH_INFO'] = $_SERVER['REDIRECT_PATH_INFO'];
}

Concrete5 CMSをGodaddyで使いたいときには以下もやってしまいましょう。

define('URL_REWRITING_ALL', TRUE);
ob_start('ob_index_handler');

function ob_index_handler($source) {
        $source = str_replace('index.php/', '', $source);
        return $source;
}

これを見つけるのに時間がかかりすぎたので現在 絶賛徹夜で残業中。

CISCOルーターでDNSリレー

  • 所謂 DNS Proxy、DNS Forwarder なるもの
  • NAT裏(プライベートアドレス)にあるFTPサーバをグローバル側に公開したいのだが、ポート20/21だけをNAPTで通して、FTPのコントロール接続のNATと連動して動的に書き換えることはできるんだろうか、と調査中。
    • 以前使用していた NTT のルータはコントロール接続の PORTコマンドの書換に対応していたので便利だったのだが。
#configure terminal
(config)#!--- 内蔵 DNSサーバを有効にする
(config)#ip dns server
(config)#!--- 名前解決を有効にする
(config)#ip domain-lookup
(config)#!--- DNS view のデフォルト設定を開く
(config)#ip dns view default
(cfg-dns-view)#!-- DNS Forwardingを有効にする
(cfg-dns-view)#dns forwarding
(cfg-dns-view)#!--- DNS Forwarding時にクエリするネームサーバのIPアドレスを指定する (複数ある場合は複数行)
(cfg-dns-view)#dns forwarder x.x.x.x
(cfg-dns-view)#dns forwarder x.x.x.x
(cfg-dns-view)#dns forwarder x.x.x.x

で動作する筈。

常に偽のIPアドレスへ解決させたい場合は

(config)#ip dns spoofing x.x.x.x
(config)#no ip domain-lookup

とすると常に指定された偽のIPアドレスへ解決されるようになる。

IE7/8のイントラネットセキュリティ

徹夜してます。思わぬアクシデントが発生したもので。

経緯:

  • 週末中に顧客DB関係のターミナルサービス環境にIE8を入れる。
  • そうしたらネットワーク共有越しの .exe がアクセス権限の問題で実行不可になった!
  • でも実行ファイルからアイコンリソースは読めているし、ローカルへ複写も可能。
  • 何かが実行時に妨害していると推測。
  • アンチウィルスの設定でもない。
  • 他の環境と連動しているからなるべくバックアップに戻したくない。

犯人はInternet Explorer 8で確定ですが。

で、色々と調べた結果。

  • ネットワークフォルダをIPアドレスでローカルにマップしている場合はイントラネットのサイト一覧に入れると良い。
  • 具体的には、192.168.0.1 を X: とマウントしているのであれば、file://192.168.0.1 をサイト一覧に入れるとエクスプローラーでもアプリ実行可能となる。

ただし、該当環境は複数の無知者が使用する環境。簡単にこの情報を設定するにはどうしたらよいか。

  • ポリシーから 管理用テンプレート>Windows コンポーネントInternet Explorer>インターネットコントロール パネル>セキュリティページを開き、
    サイトとゾーンの割り当て一覧 を構成するとシステム全体に一括設定が可能。ただしその副作用として各ユーザーが個別に除外設定を行うことができなくなる。
    ゾーンの値は以下のとおり:
    • 0 - ローカルコンピューター ゾーン
    • 1 - イントラネット ゾーン
    • 2 - 信頼済み ゾーン
    • 3 - インターネット ゾーン
    • 4 - 制限付きゾーン
  • 調べてみると、セキュリティページのサイトの設定はレジストリの HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap に格納されているとのこと。
    情報の保管場所は以下のとおり。
    • HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Domains に ホスト名単位の情報
      ドメイン名・ホスト名でサブキーが指定されており、各プロトコル (デフォルトは「*」)とゾーンが記録されている。
    • HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\RangesIPアドレス範囲単位の情報
      Range1、Range2などのサブキーがあり、その中の「:Range」 REG_SZ値にIPアドレスが記入されている。その他の値は REG_DWORD値でプロトコルとゾーンのペアとなっている (全プロトコルは「*」)。
    • HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\ProtocolDefaultsプロトコル単位の情報
      RED_DWORD値に各プロトコル (@ivt, file, ftp, http, https, shell) のゾーンが記録されている。
      ただし設定しても動きが変わらない模様。もしかしてEscProtocolDefaultsがあるかもしれないが、デフォルトでは作成されていなかった。
  • 以下、注意事項。
    • Domains階層は変態的な入れ子構造になっていることがあるので可能ならば全階層を掘って一覧化すると既存のレイアウトを維持したコードを書けるかもしれない。別に誰も見ない場所なのでレジストリ階層が汚くても問題無いとは思うのだが。
    • ホスト名は後方一致される。「hatena.ne.jp」に全プロトコル許可した場合は「*.hatena.ne.jp」を対象にしたとされる。
      プロトコル指定したとしても「http://hatena.ne.jp」は「http://*.hatena.ne.jp」と同義。
    • Windows Server 2003では「.\Domains」が「.\EscDomains」、「.\Ranges」が「.\EscRanges」となる。ESCはEnhanced Security Configurationの略で、Windows コンポーネント ウィザードで「Internet Explorer セキュリティ強化の構成」を無効化してもこのレジストリ依存性は残る。
      Server 2003以降のServer OSにあると思われる。Vistaには無かった。存在基準の判定方法が微妙なのでEsc付きがあるならそちらを優先使用するという方式が無難か。
    • Ranges系のサブキーは作成順にナンバリングされる。中間要素を削除しても番号の整列はされない。
    • IE7系では画面ホスト名の表示時に「*.」が先頭に付加されない。IE8系では付加される。

結果:

  • ログイン時に実行されるスタートアップモジュールにレジストリへの自動追記を組み込んで完了。

で最後に終電を逃した理由。

  • RegEnumKeyEx は lpClass と lpcClass に NULL値を指定した場合にも ERROR_MORE_DATA (234) を返す場合があるということに気が付くのに時間がかかりました。

オチ:

  • IE8入れたらアクティブディレクトリ全体指定のInternet Explorerのスタートページ設定が MSN で上書きされたんだけど どうしてくれようか・・・

職業病?

  • 同業他社さんに聞いたら、帯状方針はプログラマ系は一度はなるかもしれない職業病らしいですね。
  • ただし、水疱瘡になったことがある人限定。選ばれて嬉しいのか嬉しくないのか。
  • 思いもよらないような後遺症や 悪のデフレスパイラルが残ることがあるので日ごろから無理をしないように。
  • ちなみに「夜眠れないような痛み」は激痛ではありません。夜通し執拗に小突かれるような痛みで安眠できないのです。