session情報を絶対パスのURLに自動で付与する自作関数my_output_add_rewrite_var_realpath()

Read More



output_add_rewrite_var()は相対パスのURLに対してセッション情報を付与することができる。
しかし絶対パスには対応してない。
これはsession.use_trans_sidにしても同じこと。


まずはoutput_add_rewrite_var()の動きを見てみる。

■例1 output_add_rewrite_var() の例
<?php
output_add_rewrite_var('var', 'value');

// リンク
echo '<a href="file.php">リンク</a>
<a href="http://example.com">リンク2</a>';

// フォーム
echo '<form action="script.php" method="post">
<input type="text" name="var2" />
</form>';

print_r(ob_list_handlers());
?>


output_add_rewrite_var()は、
第1引数には受け取りたいキー、第2引数には受け取りたい値を指定できるようになっていることがわかる。

■出力結果
<a href="file.php?var=value">リンク</a>
<a href="http://example.com">リンク2</a>

<form action="script.php" method="post">
<input type="hidden" name="var" value="value" />
<input type="text" name="var2" />
</form>

Array
(
    [0] => URL-Rewriter
)


相対パスのみに情報が付与されているのがわかる。


絶対パスのURLにも情報を付与させたいのだが、
それに対応したURLリライトな関数はどうにも見つからなかったので自分で作ってみた。


■絶対パスをURLリライトする関数:my_output_add_rewrite_var_realpath()
<?php
/**
 * 絶対パスをURLリライトする
 * ****************************************40
 * PHP関数のoutput_add_rewrite_var()や'session.use_trans_sid'ディレクティブが絶対パスに対応していなかったので作成。
 * 想定している用途はSIDをURLに引っ付けることに限定している。
 * 
 * 注意)
 * 指定したホスト名の絶対パスURLにしか書き換え処理を行わない。
 * output_add_rewrite_var()と引数も挙動もまったく違う。
 * 第2引数のキーと値はサニタイズを済ませたものを使うこと。
 * 
 * 001 - 2013/01/11 xirasaya
 * @param string $html=null
 * @param array $aryKeyVal=array() // array(session_name()=>session_id())
 * @param array $aryTargetHost=array() // array(parse_url('http://example.com', PHP_URL_HOST)
 * @param array $aryTargetTag=array('a', 'from');
 * @return string $html
 */
function my_output_add_rewrite_var_realpath($html=null, $aryKeyVal=array(), $aryTargetHost=array(), $aryTargetTag=array('a', 'form')) {
  foreach($aryTargetTag as $val) {
    if($val=='a') {
      $sPattern = '/^(.*?)(<a.*?)(href=[\"\'])(.*?)([\"\'].*?>)(.*)$/uis';
      $html4preg = $html;
      $html=null;
      do {
        $chk = preg_match($sPattern, $html4preg, $match);
        if($chk) {
          $aryParseURL = parse_url($match[4]);
          $tikan=false;
          if(isset($aryParseURL['scheme']) and $aryParseURL['scheme'] ='http' and isset($aryParseURL['host'])) {
            if(is_array($aryTargetHost) and in_array($aryParseURL['host'], $aryTargetHost)) {
              $sReplace = null;
              $sReplace.= $aryParseURL['scheme']. '://'. $aryParseURL['host']. $aryParseURL['path'];
              $sReplace.= isset($aryParseURL['query'])?'?'.$aryParseURL['query']:null;
              $sReplace.= isset($aryParseURL['query'])?'&'.http_build_query($aryKeyVal):'?'.http_build_query($aryKeyVal);
              $sReplace.= isset($aryParseURL['fragment'])?'#'.$aryParseURL['fragment']:null;
              $tikan=true;
            }// end if
          }// end if
          if($tikan) {
            $html.= $match[1]. $match[2]. $match[3]. $sReplace. $match[5];
          }else {
            $html.= $match[1]. $match[2]. $match[3]. $match[4]. $match[5];
          }// end if
          $html4preg=$match[6];
        }else {
          $html.= $html4preg;
        }// end if
      }while($chk);
    
    }elseif($val=='form') {
      $sPattern = '/^(.*?)(<form.*?)(action=[\"\'])(.*?)([\"\'].*?>)(.*)$/uis';
      $html4preg = $html;
      $html = null;
      do {
        $chk = preg_match($sPattern, $html4preg, $match);
        if($chk) {
          $aryParseURL = parse_url($match[4]);
          $tikan=false;
          if(isset($aryParseURL['scheme']) and $aryParseURL['scheme'] ='http' and isset($aryParseURL['host'])) {
            if(is_array($aryTargetHost) and in_array($aryParseURL['host'], $aryTargetHost)) {
              $sReplace=null;
              if(is_array($aryKeyVal)) {
                foreach($aryKeyVal as $key2 => $val2) {
                  $sReplace.= '<input type="hidden" name="'. $key2. '" value="'. $val2. '" />';
                }// end foreach
              }// end if
              $tikan=true;
            }// end if
          }// end if
          $html.= $match[1]. $match[2]. $match[3]. $match[4]. $match[5];
          if($tikan) {
            $html.= $sReplace;
          }// end if
          $html4preg=$match[6];
        }else {
          $html.= $html4preg;
        }// end if
      }while($chk);
    }// end if
  }// end foreach
  return $html;
}// end function
?>



適当にテストしてみる。

■テスト
※事前に関数を定義して読み込んでおくこと。
<?php
ob_start();
?>
<html>
<body>
<a href="http://example.com/test.html">http://example.com/test.html</a><br />
<a href="http://example.com/test.html?hoge=1">http://example.com/test.html?hoge=1</a><br />
<a href="http://example.com/test.html?hoge=1&piyo=2">http://example.com/test.html?hoge=1&piyo=2</a><br />
<a href="http://example.com/test.html?hoge=1&amp;piyo=2">http://example.com/test.html?hoge=1&amp;piyo=2</a><br />
<a href="http://example.com/test.html?hoge=1#fuga">http://example.com/test.html?hoge=1#fuga</a><br />
<a href="test.html">test.html</a><br />
<a href="/test.html">/test.html</a><br />
<a href="http://localhost/test.html">http://localhost/test.html</a><br />

<form action="test2.html" method="post">
	<input type="text" name="txt_1" value="" />
	<input type="submit" name="btn_submit" value="submit" />
</form>
<form action="http://example.com/test2.html" method="post">
	<input type="text" name="txt_1" value="" />
	<input type="submit" name="btn_submit" value="submit" />
</form>

</body>
</html>
<?php
print my_output_add_rewrite_var_realpath(ob_get_clean(), array('ses'=>'1234'), array('example.com'));
?>



■テスト結果
<html>
<body>
<a href="http://example.com/test.html?ses=1234">http://example.com/test.html</a><br />
<a href="http://example.com/test.html?hoge=1&ses=1234">http://example.com/test.html?hoge=1</a><br />
<a href="http://example.com/test.html?hoge=1&piyo=2&ses=1234">http://example.com/test.html?hoge=1&piyo=2</a><br />
<a href="http://example.com/test.html?hoge=1&amp;piyo=2&ses=1234">http://example.com/test.html?hoge=1&amp;piyo=2</a><br />
<a href="http://example.com/test.html?hoge=1&ses=1234#fuga">http://example.com/test.html?hoge=1#fuga</a><br />
<a href="test.html">test.html</a><br />
<a href="/test.html">/test.html</a><br />
<a href="http://localhost/test.html">http://localhost/test.html</a><br />

<form action="test2.html" method="post">
	<input type="text" name="txt_1" value="" />
	<input type="submit" name="btn_submit" value="submit" />
</form>
<form action="http://example.com/test2.html" method="post"><input type="hidden" name="ses" value="1234" />
	<input type="text" name="txt_1" value="" />
	<input type="submit" name="btn_submit" value="submit" />
</form>

</body>
</html>



ふむ、動いてるね。

指定したドメインに合致する絶対パスのURLにのみ情報を付与している。

これでoutput_add_rewrite_var()とmy_output_add_rewrite_var_realpath()を組み合わせて使えば絶対パスのURLと相対パスのURLのどちらにも対応させることができる。



--
第4引数のarray('a', 'form')を改良して、array('a', 'form'=>'post')とかarray('a', 'form'=>'get')とか指定できるようにしても面白いかも。

まあ作ってはみたものの使うつもりはまったくないんだけど。
一応記録として。





-- 2016/03/09 改訂
久しぶりに見直すと何が言いたいのか自分でも全然わからなかったのでざっくりと書き直し。