plugins:customurl

NP_CustomURL.php

FancyURLよりも簡単? URLをカスタマイズするプラグイン!

:plugins:customurl.gif

General Plugin info
作者:       shizuki+nekonosippo+Cacher+Reine+yama
最新のバージョン: 0.3.8FIX1(2016/01/16)
入手先: https://github.com/NucleusCMS/NP_CustomURL/archive/master.zip 52.6KB
ソース: https://github.com/NucleusCMS/NP_CustomURL/blob/master/NP_CustomURL.php
動作サンプル: http://shizuki.kinezumi.net/
フォーラム参照先: http://japan.nucleuscms.org/bb/viewtopic.php?t=2236
セキュリティチェック:

NP_CustomURLの特長

  • URLを自由にカスタマイズできます。
  • 設置が簡単。標準実装のFancyURLよりも簡単です。
  • 複数blogの設置に必要な *.phpファイルが不要になります。
  • RSSフィード生成に必要だったxml-rss2.php/atom.phpが不要になり、rss1.xml/rss2.xml/atom.xmlなどの静的で分かりやすいURLでアクセスできるようになります。
  • URL表現に関わるいくつかのプラグイン(NP_ExtraSkinJPなど)の設置に必要なURL制御ファイルも不要になり、ルートディレクトリがすっきりします。
  • トラックバックURLを短くできます。
  • イレギュラーなURLにアクセスした時、適切なレスポンスヘッダを返します。見た目には関係ありませんが、SEO対策として有効。
  • FancyURLと比べ、URL階層を浅くシンプルに表現できます。これもSEO対策上有利と思われます。
  • URLカスタマイズをする際にさくらのレンタルサーバ(さくらインターネット)で必要だった、PATH_INFOまわりのコア改造が不要です。

インストール方法

  1. Zipファイルを展開して、「NP_CustomURL.php」と「customurl」ディレクトリをサーバーのプラグインディレクトリにアップロードする
  2. 管理画面の「グローバル設定」で URLモードを「Fancy」に設定する
  3. .htaccess の書き換え(新規に設置する場合は同梱のsample.htaccessをどうぞ)
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?virtualpath=$1 [L,QSA]
  4. index.php の書き換え(同梱のsample_index.phpをリネームしてもかまいません)
    <?
    $CONF = array();
    $CONF['Self'] = '';
     
    include('./config.php');
     
    selector();
     
    ?>
  5. 管理画面からプラグインをインストールする

CPI のサーバを利用する場合の注意点

ユーザーの方から情報をいただきました CPI のサーバで NP_CustomURL を利用する場合、.htaccess の RewriteEngine on の前に

Options +FollowSymLinks

を追加しないと 403 エラーになるそうです ブロゲ様、情報ありがとうございました

このプラグインの使い方

各ブログ・カテゴリ・アイテム等の URL をカスタマイズし、通常サイトと同じ様なディレクトリ階層の URL を提供します
URL のカスタマイズはプラグインの管理画面、または各ブログ・カテゴリ・アイテムの設定画面で変更します
NP_MultipleCategories のサブカテゴリに対応しています(無限階層対応)

ブログ、アイテム、カテゴリ、メンバーの各個別の仮想ディレクトリ・ファイル名は、それぞれの編集画面、及びプラグインの管理画面(インストールしたままの状態だと左端の『クイックリンク』に管理画面へのリンクが表示されます)から変更する事が出来ます サブカテゴリの仮想ディレクトリ名は、プラグインの管理画面からのみの変更になります

デフォルトの仮想ディレクトリ・ファイル名

  • ブログ
    各ブログの『ブログの短縮名(ショートネーム)』
  • カテゴリ
    各カテゴリの ID の前に 「category_」
  • サブカテゴリ
    各サブカテゴリの ID の前に 「subcategory_」
  • 個別メンバー
    メンバーの『表示名(ログインネーム)』
  • アーカイブ一覧
    archives
  • 月別アーカイブ
    archive
  • メンバー
    member
  • 個別アイテム
    アイテムの ID の前に「item_」

ブログ仮想ディレクトリ以外のデフォルトはオプションの編集画面で変更できます

RSS/ATOM

RSS、ATOM へのリンクは、通常通り

<%sitevar(url)%>xml-rss2.php?blogid=n

と書く事も出来ますが(このときは blogsetting ではなく、必ず sitevar を使用してください)、固定ファイルの様に

<%blogsetting(url)%>rss2.xml

と書く事も出来ます(こちらは blogsetting でも sitevar でもどちらでも可)

上の対応に添って記述するようにしてください

スキン/テンプレートへの記述

URL・リンクの出力(スキン・テンプレート共通)

<%CustomURL(i/12/i, LinkTest, LinkTitle)%>
  • 第1パラメータ(i/12/i)
    リンク先の種類、id、id かリンクネームかの種別を '/' で区切って記述します
    第1パラメータのみの指定の場合、出力は <a href=~> の形ではなく、URL(http:~) のみの出力となります
    • 数字のみが書かれた場合、blogid として処理されます
    • 3番目が省略された場合は2番目を id として処理します
    • アイテムへのリンクに使用できるのは id のみです
    • 2番目にアイテムidを指定時のみ、3番目に[path]を指定する事が出来、
      そのアイテムにつけた仮想ファイル名(例:item_123.html)が出力されます
  • 第2パラメータ(LinkText)
    リンクを張るテキストを指定します(省略可能)
  • 第3パラメータ(LinkTitle)
    <a> タグの title 属性を指定します
    LinkText が指定されている時にこのパラメータが省略された場合は title 属性に LinkText が指定されます

全てのパラメータが省略された場合は、カレントのブログの URL が出力されます

使用例

  • テンプレートにアイテムの parmlink として表示する場合
    • 記述 > <%CustomURL(,permalink)%>
    • 出力 > <a href="アイテムのURL" title="permalink">permalink</a>
  • スキンに「日記」カテゴリ(仮想ディレクトリ名:Nikki)へのリンクを固定的に表示する場合
    • 記述 > <%CustomURL(c/Nikki/n,日記,このブログのメイン)%>
    • 出力 > <a href="「日記」カテゴリのURL" title="このブログのメイン">日記</a>

トラックバック用 URL 出力(スキン・テンプレート共通)

<%CustomURL(trackback)%>

NP_TrackBack 用のトラックバック URL を出力します
標準では

http://example.com/trackback/item_123.html

になります\\

<%CustomURL(trackback,ext)%>

と書くと

http://example.com/item_123.trackback

に変更する事が出来ます

記事中への記述

<%CustomURL(i/12/i, LinkTest, LinkTitle)%>
  • 第1パラメータ(i/12/i)
    リンク先の種類、id、id かリンクネームかの種別を '/' で区切って記述します
    第1パラメータのみの指定の場合、出力は <a href=~> の形ではなく、URL のみの出力となります
    • 数字のみが書かれた場合、itemid として処理されます
    • 3番目が省略された場合は2番目を id として処理します
    • アイテムへのリンクに使用できるのは id のみです
  • 第2パラメータ(LinkText)
    リンクを張るテキストを指定します(省略可能)
  • 第3パラメータ(LinkTitle)
    <a> タグの title 属性を指定します
    LinkText が指定されている時にこのパラメータが省略された場合は title 属性に LinkText が指定されます

全てのパラメータが省略された場合は、カレントのアイテムの URL が出力されます

オプション

グローバルオプション

:plugins:customurl_op.png

  • アーカイブディレクトリへの Path の名前
    仮想アーカイブディレクトリの名前
  • アーカイブリストディレクトリへの Path の名前
    仮想アーカイブリストディレクトリの名前
  • メンバーディレクトリへの Path の名前
    仮想メンバーディレクトリの名前
  • 新規作成時のアイテムのURIの接頭語
    アイテムのリンク名にデフォルトで付く文字列
    <%year%>、<%month%>、<%day%>を使用して、投稿された年月日を使用することが出来ます
  • 新規作成時のカテゴリーのURIの接頭語
    カテゴリーのリンク名にデフォルトで付く文字列
  • 新規作成時のサブカテゴリーのURIの接頭語
    サブカテゴリーのリンク名にデフォルトで付く文字列
  • アンインストールするときにテーブルを削除しますか?
    アンインストール時に CustomURL が使用しているデータベーステーブルを削除するかどうか
  • クイックメニューにショートカットを追加しますか?
    クイックメニューに CustomURL の管理画面へのリンクを追加するかどうか
  • URI に該当するデータが存在しなかった場合の挙動
    受け取った URL に対応するデータが存在しなかった時の挙動
    • 404 Not Found
      404レスポンスヘッダを返し、エラーページを表示
    • 303 See Other
      303レスポンスヘッダを返し、直近のディレクトリを表示

ブログオプション

:plugins:customurl_op_b.png

  • このブログで URI の別名を使用する
    CustomURL を使用した URL を出力するかどうかの設定
    ここを「いいえ」にした場合でも、CustonURL でのアクセスは受け付けます(CustomURL の仕様をやめて通常の URL で運用する場合の移行用)
  • ノーマルの URL でアクセスがあった時にリダイレクトしますか?
    ノーマル URL(index.php?itemid=123) でアクセスがあった場合にリダイレクトさせるかどうか
  • 検索の時の URL を 「/search/検索語」にリダイレクトしますか?
    index.php?query=検索語 の URL をリダイレクトするかどうか
  • このブログのリクエスト URI
    ブログにアクセスする為のブログ仮想ブログディレクトリの名前

カテゴリーオプション

  • このカテゴリーのリクエスト URI
    カテゴリーにアクセスする為のブログ仮想カテゴリーディレクトリの名前

メンバーオプション

  • このメンバーのリクエスト URI
    メンバーページの仮想ファイル名(拡張子(.html)自動付加)

Tipsと裏技

URLにカテゴリー名を含めたい時

見た目だけでなく、検索エンジンへのURL多重登録を防ぐ効果もあります。

<%categorylink%><%CustomURL(path)%>

URL多重登録防止については後述の「URLの多重登録を防ぐ」もご覧ください。

feed のファイル名やスキン名を変更したい時

拡張子の変更はなしです あくまでもファイル名のみです(拡張子は .xml でお願いします) NP_CustomURL.php の1406行目からが、contentType ヘッダの送出部分になります ここの

				case 'rss1.xml':
				case 'index.rdf':
				case 'rss2.xml':
				case 'atom.xml':

の部分に変更したいファイル名を書き換えます 次にその下の

			switch (end($path_arr)) {
				case 'rss1.xml':
				case 'index.rdf':
					$skinName = 'feeds/rss10';
					break;
				case 'rss2.xml':
					$skinName = 'feeds/rss20';
					break;
				case 'atom.xml':
					$skinName = 'feeds/atom';
					break;
			}

の部分も、上で書き換えたものに対応させる形で書き換えます スキン名を変更する場合はこの部分を書き換えてください

これ変える人あまり居ないと思ったんで決め打ちにしちゃってます

他プラグインへの対応

NP_Analyze

そのままだと「アクセスページ」部分のリンクが正常に出力されませんので以下の改造をします NP_Analyze(v0.533)の1256行目付近

	function IdChange($select = '', $id = '', $other = '', $past = '', $c = '', $que = '', $hd = '') {
		global $CONF, $member;

	function IdChange($select = '', $id = '', $other = '', $past = '', $c = '', $que = '', $hd = '') {
		global $CONF, $member, $manager;

に、その下1260行目付近

		switch(TRUE) {
		case ($past == '+'):

		switch(TRUE) {
		case ($manager->pluginInstalled('NP_CustomURL')):
		case ($past == '+'):

に変更することで、正常に URL が出力されます

NP_ContentList

※最新版のNP_ContentListでは以下の改造は不要です。
こちらも URL 出力を正常にする変更
このプラグインは、独自に URL を生成しているので、ここをグローバルファンクションを使用するように書き換えます 「function doSkinVar()」内の467行目からの

// sub category ---

で括られているブロックの486行目

$subdata['sublink'] = addLinkParams($catdata['catlink'], array($subrequest => $subdata['subcatid']));

と書いてある次の行に

if ($CONF['URLMode'] == 'pathinfo' && $manager->pluginInstalled('NP_CustomURL')) {
	$customurls = $manager->getPlugin('NP_CustomURL');
	$subdata['sublink'] = $customurls->_addLinkParams($catdata['catlink'], array($subrequest => $subdata['subcatid']));
}

と挿入、396行目から465行目までの

// Categories --------------------

ブロックの終了後、466行目に

if ($CONF['URLMode'] == 'pathinfo' && $manager->pluginInstalled('NP_CustomURL')) {
	$catdata['catlink'] = createCategoryLink($catdata['catid']);
}

最後に348行目の

$data['self'] = $data['blogurl'];

の前の行に

if ($CONF['URLMode'] == 'pathinfo' && $manager->pluginInstalled('NP_CustomURL')) {
    $data['blogurl'] = createBlogidLink($data['blogid']);
}

を追加すれば完了です (行番号はバージョン2.0のものになります)

NP_TagEX

そのままだと URL の真ん中にタグのリンクが入ったりしてややこしいんで、必ず最後に来るように URL 生成部分を変更 一番最後のファンクション

creatTagLink()

の最後の

return addLinkParams($link, $linkparams);

の直前に、次のコードを挿入します

global $manager;
if ($manager->pluginInstalled('NP_CustomURL')) {
    $customurls = $manager->getPlugin('NP_CustomURL');
    $link = 'tag/' . $ready . $sep . $this->_rawencode($tag);
    return $CONF['BlogURL'] . '/' . $customurls->_addLinkParams($link, $linkparams) . '/';
}

これでタグがURLの一番最後になります

NP_TrackBack

外部からのトラックバックはむ改造で対応してますが、このままだとローカルトラックバックが打てないので改造します 2479行目あたりからの

	function handleLocalPing($itemid, $title, $excerpt, $blog_name, $ping_url){
		global $manager;

のブロックの

		} elseif ( preg_match("/itemid=([0-9]+)/",$ping_url,$idnum) ){
			$tb_id = intval($idnum[1]);
		}

		if ((!$manager->existsItem($tb_id,0,0)) && ($this->getOption('CheckIDs') == 'yes'))
			return _ERROR_NOSUCHITEM . "[ $tb_id ]";

の間に、次のコードを挿入します

		if ($manager->pluginInstalled('NP_CustomURL')) {
			$plugin =& $manager->getPlugin('NP_CustomURL');
			$tmp_url = parse_url($ping_url);
			$$tmp_url['path'] = trim($tmp_url['path'], '/');
			$path_arr = explode("/", $$tmp_url['path']);
			$i = count($path_arr) - 1;
			if (substr($path_arr[$i], -5) == '.html') {
				$item_name = $path_arr[$i];
				$trush = array_pop($path_arr);
			} elseif (substr($path_arr[$i], -10) == '.trackback') {
				$item_name = (substr($path_arr[$i], 0, -10)) . '.html';
			}
			$trush = array_pop($path_arr);
			$blog_url = $tmp_url['scheme'] . '://' . $tmp_url['host'] . '/' . implode('/', $path_arr);
			$blog_url = preg_replace('|[^a-zA-Z0-9-~+_.?#=&;,/:@%]|i', '', $blog_url);
			$tbbid = quickQuery('SELECT bnumber as result FROM '.sql_table('blog').' WHERE burl = "'.$blog_url.'"');
			$tbbid = intval($tbbid);
			if (!empty($tbbid) && $plugin->getBlogOption(intval($tbbid), 'use_customurl') == 'yes') {
				$item_name = preg_replace('|[^a-zA-Z0-9-_.]|i', '', $item_name);
				$que = 'SELECT obj_id as result FROM %s WHERE obj_param = "item" AND obj_name = "%s" AND obj_bid = %d';
				$tbiid = quickQuery(sprintf($que, sql_table('plug_customurl'), $item_name, intval($tbbid)));
				if (!empty($tbiid)) $tb_id = intval($tbiid);
			}
		}

「/trackback/item_123.html」「/item_123.trackback」の両方に対応できます

URLの多重登録を防ぐ

当プラグインをインストールしていてもindex.php?itemid=xxxによるアクセスは可能です。検索エンジン対策上、URLの多重登録を防ぎたい場合はrobots.txtに以下を記述します。

User-agent: *
Disallow: /index.php?*
User-agent: Googlebot
Noindex: /index.php?*

さくらインターネットのレンタルサーバでエラーが出る場合

さくらインターネットのサーバで Internal Server Error(500) のエラーが出ることがあります。この場合は.htaccessの中身を

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?virtualpath=$1 [L,QSA]

(RewriteBase / の行を追加)

または

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?virtualpath=$1 [L,QSA]

(index.phpの頭に / を付ける)

を試してみてください。

希望事項

バグ

開発履歴

  • Version 0.3.8-fix1(2016/01/16)
    • Fix for PHP7
    • Fix for PHP5.4
    • Fix for PHP5.3
    • 他細かな修正
  • Version 0.3.8(2014/07/15)
    • Fix for PHP5.4
    • Replace mysql_xxx function
  • Version 0.3.7-fix4(2013/08/15)
    • Nucleus3.65に対応(Reine氏による改修)
  • Version 0.3.7(2007/09/09)
    • リダイレクトの無限ループが起きるバグに対応
    • PreItemでpreg_replace_callbackをやめてdoItemVarを採用(コアのバージョンが3.3未満の場合は従来通り)
  • Version 0.3.6(2007/03/05)
    • ブログのURLの最後が'/'で終わらない場合がある不具合に対応
    • 非無限階層版のNP_MultipleCategoriesに(多分)対応
    • 次期Nucleus3.3のスペシャルスキンパーツに対応
  • Version 0.3.5
    • アイテム URL 用テンプレートの typo を修正
    • カテゴリをブログ間移動した時に、plug_customurl テーブル内のアイテムの所属ブログが変わっていなかった不具合を修正
  • Version 0.3.3
    • 最新版 NP_TrackBack のトラックバック URL をそのままでも受け付けるように改良
    • トラックバック URL の出力を、改造なしで変更できるように改良
    • 日付URL のときの桁数を月・日共に二桁に統一
    • デバッグコードがそのまま残っていたのを削除
    • 新規インストール時にエラーが出る不具合を修正
  • Version 0.3.2c
    • アイテムのリンク名の初期値テンプレートがなぜか効かなくなっていたので修正
  • Version 0.3.13
    • 存在しない「xml-rss1.php」、「xml-rss2.php」、「atom.php」へアクセスした時に正しくリダイレクトされるように修正
    • normalURL をリダイレクトする際に [~id=] 以外のクエリ文字列が無視されていたのを修正
  • Version 0.3.11
    • トラックバック受信時のレスポンスを正しく返すよう修正
    • ヘルプファイル変更
  • Version 0.3.1
    • NP_GoogleSitemap 対応
    • テンプレート変数で<%CustomURL(path)%>と記述した時に、カレントアイテムの仮想ファイル名を書き出すよう変更
  • Version 0.3.0
    • RSS、ATOM の URL を NP_CustomURL で処理(rss2.xml、index.rdf、atom.xml等)
    • 存在しない URL がリクエストされた時の挙動を変更(オプションで選択) (404 or 303)
    • トラックバック URL の出力に対応
    • ノーマル URL (index.php?itemid=123) を FancyURL にリダイレクト(302)
    • サイト内検索の URL を「search/検索語」にリダイレクト(301)
    • グローバル変数「$CONF['Self']」をアクセスがあったブログ毎に再定義
  • Version 0.2.3: 不具合修正・機能追加
    • リダイレクト周りにバグがあったので修正
    • 「カスタマイズされたURLを使用する」を「はい」にしている時、旧来のFancuURLでアクセスしてきたクライアントに301を返してリダイレクトするように変更
  • Version 0.2.2a: 不具合修正
    • SQLインジェクションを引き起こす可能性がある脆弱性に対処
  • Version 0.2.2: 不具合修正・機能追加
    • バグフィックス
    • アイテム・カテゴリー・サブカテゴリーの新規作成時のデフォルトの接頭語のオプションでの変更に対応
      アイテムの接頭語のみテンプレート化
  • Version 0.2.1a: 不具合修正
    • バグフィックス
  • Version 0.2.1: 機能追加
    • サブカテゴリの多段URL化
    • カテゴリ・ブログの削除時にサブカテゴリのデータが消去できていなかった不具合を修正
  • Version 0.1.9: 機能追加
    • カテゴリ及びアイテムのブログ間移動に対応
  • Version 0.1.8a: 不具合修正・機能追加
    • 新規サブカテゴリのパス登録のタイミング変更に伴う修正
    • ブログ毎にカスタマイズした URI を使用する・しないを選択できるようにオプションを追加
    • ヘルプファイルの修正
  • Version 0.1.8: 不具合修正
    • 新規ブログ作成時に自動で作成される'General'カテゴリーに対するURIが正常に動作しなかった不具合に対応
    • ブログを削除した時に、削除したブログに属する「カテゴリー」「サブカテゴリー」「アイテム」のURIがテーブルに残ったままになっていた不具合に対応
    • 新規サブカテゴリーのパスの登録のタイミングをリンクが生成される時に変更(リンク生成前に管理画面でURIを設定していた場合は設定したURIが使用されます)
    • 管理ページでアイテムURIがおかしくなっていたのを修正
  • Version 0.1.7: 不具合修正
    • ほぼ全面的に書き直し
    • 新規アイテム追加時にトラックバックを送信した時に、トラックバック元のURLが正しく送信できなかった
    • 管理画面からサブカテゴリのパスを編集したときに、リストが表示されなかった
  • Version 0.1.5: 公開バージョン
  • Version 0.01: 初期バージョン(NP_Pathの改造バージョン)
 
plugins/customurl.txt · 最終更新: 2016/08/04 17:26 by fujisaki