Calender
Sun Mon Tue Wed Thu Fri Sat
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
<< July 2017 >>
広告
SEARCH

SELECTED ENTRIES
RECENT COMMENTS
RECENT TRACKBACK
CATEGORIES
ARCHIVES
LINKS
PROFILE
OTHERS
SKYPE
PC: skype.jojo.jp
chat
iPad: iphone.jojo.jp
chat call
THANKS



本日:
昨日:
多言語
広告
 ▼▲ 作業日報 ▼△
    What's under the hood?
<< mod_proxy覚書 | main | youtube >>
【PukiWiki】リンクの相対URLプラグイン
ある複雑な社内のネット(事情も複雑・・)を介してアクセスがあるWikiWebサーバで「見れない!」(正確にはリンク先が)と苦情があった。調べてみるとクライアントの位置によってNATによりWikiWebサーバアドレスが違う為、絶対リンクのアドレスを解決できない状態だった、、

とりあえず、クライアントにより、相対パス解決・サーバアドレス置換するPukiWikiのプラグインを作成

通常のPukiWikiではリンクは絶対URLが前提となっている
[[エイリアス名>http://www.example.com/]]
[[エイリアス名:http://www.example.com/manual/]]
下のように書きたかった
[[エイリアス名>/]]
[[エイリアス名:/manual/]]
この記述はできない
相対URLが利用できないために以下のような場面で問題が発生する

(1)社内などで見る位置(NAT等)によりサーバのIPアドレスがちがう場合
http://192.168.1.1/wiki/ と http://111.111.111.111/wiki/ が同一コンテンツ

(2)マルチドメインで管理しているがドメイン間移動をさせたくない(https等)場合
http://site1/wiki1/ と http://site2/wiki2/ が同一サーバで運用しているがサーバー名は変えずに
http://site1/mnual/ と http://site2/manual/ にリンクで移動させたい場合

InterWiki機能を利用すればリンク先をあらかじめ登録しておけますが元々「固定のリンク先を登録しておくためのもの」なので上記のような場面ではやはり相対リンクに対応する必要がでてきます

slink.inc.php(とりあえずslink()という名前にしました)

リンク先に絶対URLが含まれていてもクライアントから見えるサーバアドレスへ置換します

ソース:
<?
// 相対位置リンクのサポート(インラインのみ)
//
// 引数:
//        リンク文字  ............リンクを付けたい文字列
//        URL    .................リンク先相対URL(ホスト名が指定された場合は自動的に調整)
//        Aタグオプション(任意)...Aタグのそれ以外のオプション文字列( target='_blank'等)
//
// 利用例:
//    (相対URLのサポート)
//        slink(ああああ,/foo/bar/index.html) ...... 
//                 http://[wikiのサーバ名]/foo/bar/index.html
//    (ホスト名の修正)
//        slink(ああああ,http://[別のサーバ]/foo/bar/index.html) ...
//                http://[wikiのサーバ名]/foo/bar/index.html
//    (相対位置のサポート)
//        slink(ああああ,../aaa/index.html) ........ 
//                http://[wikiのサーバ名]/foo/aaa/index.html
//

 
function plugin_slink_inline(){
    
$args func_get_args();
    
//パラメータの取得
    
if (isset($_SERVER['SCRIPT_URI'])){//これは取れない場合もある
        
$arrMyUrl  parse_url($_SERVER['SCRIPT_URI']);
        
$strsvr    $arrMyUrl['host'];
        
$strScheme $arrMyUrl['scheme'].'://';
        
$strPath   $arrMyUrl['path'];
    } else {
        
$strsvr '';
        
$strScheme 'http://';
        
$strPath   dirname($_SERVER['PHP_SELF']).'/';
    }
    
    
//ホスト名が指定されている場合はホスト部分を削除する
    
$arrPara  parse_url($args[1]);
    if (isset(
$arrPara['host'])) {
        
$strHref $arrPara['path']. (isset($arrPara['query']) ? '?':'').$arrPara['query'].
(isset(
$arrPara['fragment']) ? '#':'').$arrPara['fragment'];
    } else {
        
$strHref $args[1];
    }

     
//ホスト名の解釈
     //ヘッダーから
     
if ($strsvr == ''){
        
$request_headers getallheaders();
        
$strsvr trim(htmlspecialchars($request_headers['Host'].$request_headers['host']));
    }
    
    
$strBase $strScheme.$strsvr.$strPath;
    
    
$strNewUrl  htmlspecialchars(getAbsPath($strBase,$strHref));
    
    
$strNewName htmlspecialchars($args[0]);

    
$strOpt     htmlspecialchars($args[2]);
    
    return 
"<a href='$strNewUrl' $strOpt>$strNewName</a>";
    
 }

//http://q.hatena.ne.jp/1147917870
//lains you 氏作成の関数を流用させていただきました
function getAbsPath($base$href){
    
$url_info parse_url($base);
    
$bdir = (substr($url_info['path'], -1) == '/') ? $url_info['path'] : dirname($url_info['path']).'/';

    if(
ereg('^https?://'$href)){
        
$path $href;
    }elseif(
substr($href01) == '/'){
        
$path $url_info['scheme'].'://'.$url_info['host'].$href;
    }else{
        
$path $url_info['scheme'].'://'.$url_info['host'].$bdir.$href;
    }

    
$path ereg_replace("/¥./""/"$path);
    while( 
ereg("¥.¥./"$path) ){
        
$url_info parse_url($path);
        
$paths preg_split("/¥//"$url_info['path']);

        for( 
$cnt=$cnt<count($paths) ; $cnt++ ){
            if( 
$paths[$cnt] == ".." ){
                
$paths[$cnt-1] = "";
                
$paths[$cnt] = "";
            }
        }

        
$str "";
        foreach( 
$paths as $value ){
            if( 
strlen($value) != ){
                
$str .= "/".$value;
            }
        }
        
$path $url_info['scheme'].'://'.$url_info['host'].$str;
    }
    return 
$path;


?>

slink.inc.php ....ダウンロード

リンク:
php4において、引数で与えられた相対URLを絶対URLに変換する関数、または公開されているソースはありませんか?
| 開発関連 | 12:06 | comments(0) | trackbacks(1) |









http://blog.jojo.jp/trackback/964790
リンク切れチェック:久しぶりに「簡易ツール」をひとつ。これも必要に迫られて実装、PHPでリンク切れチェックを行なうブログパーツ ・・・ 【創ったmetaboy】
 必要に迫られ、  ・PHP で、   ・HTMLを走査・パースし  ・公開ソース利用して   ・リンク切れチェックを行なう  ツールを作成。  ...
| 創るmetaboy | 2009/05/19 11:46 AM |