TwitterでURLをツイートする場合、URLの末尾に半角スペースを忘れたり、うっかり全角スペースを挟んでしまい、タイムライン上から正しくリンク先にジャンプできなくなる場合があります。

全角スペースを挟んじゃって正しくリンクが貼られなかった例
▲全角スペースを挟んじゃって正しくリンクが貼られなかった例。
こういうリンクをクリックしても、404ページに飛ばされちゃいますよね。。。

せっかく自分のブログをツイートして貰ったのに、そのリンク先は存在せず404エラーが表示されてしまう。。。そんな悲しい事態をサーバー側で防ぐ方法を考えて見ました。

設定ディレクティブ

運営しているサーバーの.htaccessまたはapacheに以下ディレクティブを追加します。
サーバーにmod_rewrite.soがインストールしてある必要があります。

以下、HTMLファイルの拡張子は.htmlである事を前提に書いたものです。
拡張子が異なる場合、適時変更の必要があります。
URLの途中にも「.html」の文字が含まれる場合は、正しく作動しません。

RewriteEngine On
RewriteBase /
          #↑上記は上手く作動させるためのおまじない。無くても動くサーバーもあり。
RewriteCond %{REQUEST_FILENAME} !^.*\.html.*\.html$
          #.html が複数回含まれるURLをチェック
RewriteRule ^(.*)\.html.*\.html /$1\.html [R=301,L]
          #.html が複数回含まれるURLで無限ループが発生しないよう処理
#RewriteCond %{REQUEST_FILENAME} !^.*\.html#
          #↑注意ID指定したページ内リンクのURLを除外する為にコレを記述は無駄。
RewriteCond %{REQUEST_FILENAME} !^.*\.html$
          #↑htmlで終わるURLを除外する
RewriteCond %{REQUEST_FILENAME} "\.html.*"
          #↑URL末尾の.htmlの後ろに余分な文字がくっついていたら反応させる
RewriteRule ^(.*)\.html.* /hogehoge/$1\.html [R=301,L]
          #.html 後の余分な文字の無いURLへリダイレクトさせる。
          #hogehoge/の部分は、自分のサーバーのディレクトリに置き換える
         #大抵のサーバーではhogehoge/の部分は、必要ない。

RewriteEngineの記述は滅多にやらないので、思い出しつつ・アチコチのサイトを参考にしつつ、2時間半かけてようやく完成(^_^;

サンプル
https://freesoft.tvbok.com/freesoft/virtual/wincdemu.html wincdemu
https://freesoft.tvbok.com/youtube_f/method/youtube_login.htmlユーチューブにログインできない
▲htmlの後ろに余分な情報がくっついていても無視される。

補足「%23」問題点

あんまりこの話題を読んだ事が無いけれど、URLの中に「%23」にエンコードされた「#」が含まれていると404エラーが発生する。

上記のディレクティブ中に
RewriteCond %{REQUEST_FILENAME} !^.*\.html#
を追加すると、何故かこのURLエンコード済みの「%23」にも反応して、404エラーを解消する事ができない。

この一文を外すと、「ID指定した#付きURLも省略されちゃうんじゃないの?」と思いきや、外部サイトからでもページ内リンクにしっかりジャンプしてくれるようです。
この辺の仕組みは、私にとっては謎すぎる。。。

サンプル
https://freesoft.tvbok.com/freesoft/youtube/youtube_flash.html#youtube00
https://freesoft.tvbok.com/freesoft/matome/dvdcopy_freesoft.html#copy_freesoft03
▲ID指定のページ内リンクも、しっかり飛んでくれます。

Yahoo知恵袋コピペブログの対処方法

以下、ついでに作った。
Yahoo知恵袋に紹介されたURLは、テキスト上は
http://exsample.com/hogehoge/foofoo...
てな表記になり、...が付いて途中で切れる場合が多い。

これを丸々コピペするブログがある。そのブログが自動リンクに対応していると、http://exsample.com/hogehoge/foofoo... にリンクを貼られてしまう。
当然クリックしたユーザーには404ページが表示される。

RewriteCond %{REQUEST_FILENAME} "\.\.\."
RewriteRule ^(.*) /hogehoge/ [R=301,L]

赤字部分は自サイト内の任意のURLに設定。
途中で切れちゃっているので、TOPページにリダイレクトさせるのが一番良いかも。
またはYahoo知恵袋コピペサイト専用の入り口ページを作ってそこへアクセスを流し、
「知恵袋で良く紹介されているページ一覧」を作っておいても良いかも。

あとがき

サーバー運営に長けている方は、こんなの朝飯前なんでしょうね。
私はたったこれだけのディレクティブを組むのに2時間半も試行錯誤しちゃいました。
それ以前に、「これに取り組もう」と腰を上げるまで半年かかったです(^_^;)

「いつか、誰かが解りやすく書いてくれないかな~」なんて淡い期待をもっていましたが、待てども待てども、『twitter 全角|半角404 回避』『twitter リンク404』とかの検索キーワードで引っかかるページが登場しない。

いい加減しびれを切らしてしまい、自分で頑張りましたとさ(´∀`)ノ

参考にしたサイト
 mod_rewrite を使うときには 404 の扱いに注意 - World Wide Walker
 Kung Noi:rewriteモジュールでURLを書き換えろ!
 mod_rewrite サンプル集/楽