Neo Inspiration

Avatar

中の人:jakkrokk (HN統一しました) がphp,javascript,air,flex などなど好き勝手書いてます。仕事は主にWEBシステムの設計と開発、SEO全般など。

.htaccessでファイルがあったらリダイレクトしない処理

なんか今日3人から聞かれたので何でだろうって思ったら、
「.htaccessでファイルがあったらリダイレクトしない」 みたいなかんじで
検索しても出てこないんですね。

「RewriteCond」まで思いつけば割とすぐなんですが。

ということで、こんなかんじですよっと。

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

・!-f はファイルがあったら以下のRewriteRuleを適用しない
・!-d はファイルがあったら以下のRewriteRuleを適用しない

これで「.htaccessでファイルがあったらリダイレクトしない」で検索して
ヒットしてくれればいいんだけどw

WordPressのパーマネントリンクを切り替えた時のリダイレクト設定

そういえば元もとこのブログはWordPressのデフォである

http://neoinspire.net/?p=1

みたいなURLだったんですが、
いつかGoogleのテストもかねて今の形に変えたんですよね。
そんときにぜんぜん切り替わってくれなかったのは覚えてるんですが、
ふと Google Webmaster Toolsを見ていたら旧URL経由で
404を返すページが結構あることに気づいて、
しょうがないので .htaccessでフォルダごと というか
正規表現マッチで全部移動させることに。

まあ一瞬だろ っておもってこんな感じで書く。

Redirect permanent /?p=(.*)$ http://neoinspire.net/archives/$1

動かないww

で10分ほど調べたところでポン。
RedirectMatch じゃんね。

ついつい RewriteRule の時のようにそのまま正規表現書いちゃうんだけど
Redirectじゃ正規表現使えなくて
RedirectMatchを使うんだった。。。

ってことでこんなかんじになりました。

RedirectMatch permanent /?p=(.*)$ http://neoinspire.net/archives/$1

これで /?p=*** を全部今のURLに301で飛ばしてくれる!

天下一プログラマーのお題

天下一プログラマー

凡愚なので、すらすらとは解けないわけです。
というかビットがどうのなんて普段触らないので
いまいちピンとこなかったわけですが、
なんとなしに packかなーとおもってやってみたらできた。
(これは10分でわかった!)

echo mb_strlen(pack('H*','e4bba5e4b88be381aee69687e5ad97e58897e381af5554462d38e38292e69687e5ad97e382a8e383b3e382b3e383bce38387e382a3e383b3e382b0e5bda2e5bc8fe381a8e38199e3828b3136e980b2e695b0e381aee38390e382a4e38388e58897e381a7e38182e3828be38082'),'UTF-8');
//41

他にもやり方あるかなーとおもって
勉強ついでに手でpackしてみる
(こっから1時間コース orz)

$odai = "e4bba5e4b88be381aee69687e5ad97e58897e381af5554462d38e38292e69687e5ad97e382a8e383b3e382b3e383bce38387e382a3e383b3e382b0e5bda2e5bc8fe381a8e38199e3828b3136e980b2e695b0e381aee38390e382a4e38388e58897e381a7e38182e3828be38082";
//これで16進数文字を2進数に直して
for ($i=0;$i<strlen($odai);$i++) $dec .= str_pad(base_convert($odai[$i],16,2),4,0,STR_PAD_LEFT);

//正規表現でとってみる
print(preg_match_all("/(0[0-1]{7})|(110[0-1]{13})|(1110[0-1]{20})/u",$dec,$match));
//41

//真面目にループしてみる
$strCount = 0;
for ($i=0;$i<strlen($dec);$i+=8) {
    if (substr($dec,$i,1) === '0') {
       $strCount += 1;
    } else if (substr($dec,$i,3) === '110') {
        $strCount += 1;
        $i +=8;
    } else if (substr($dec,$i,4) === '1110') {
        $strCount += 1;
        $i +=16;
    }
}
print($strCount);
//41

意外とできるもんだ~

さて天下一プログラマーはどんな答えになるんだろう?

ぐぐって偉い人の答えを見てると
だいたい [89ab]. で直で正規表現でとってるようで。
UTF8の仕組みがよくわかってないとだめだなぁ。

Continue Next page

Twitter