• ディレクトリ構造を通常のサイト風にする方法。#

  • Phize Reply #1, 4 years, 10 months ago

    Reply
    MODxのディレクトリ構成を通常のサイト風にして運用しています。うまく動作しているようなので、私の行った手順をポストさせていただきます。
    ディレクトリ構成(URI)にしっくりこない方や、検索エンジン等にクローンページとして認識されるのが不安な方は一度、お試しください。
    必要なものは、SEO Strict URLsプラグイン(改造)(とできればmod_rewrite)の使える環境です。
    (MODx 0.9.6 + SEO Strict URLs 1.0.1で試しました。)

    ※SEO Strict URLプラグイン: ドキュメント中のサイト内URIを、自動的に一定のURIに変換してくれるプラグイン。
     また、通常のフレンドリーURLはエイリアス風で各ページのURIが一意ではありませんが、このプラグインを導入するとページごとに一定のURIにリダイレクトされるようになります。

    ここでは次のようなツリー構成の計3ページを例にしています。

    MODxのツリー サイト名(0)
     +
     +-- ホーム(1)     エイリアス:index.html
     +
     +-- カテゴリー(2)   エイリアス: folder
         +
         +-- ページ(3) エイリアス: page.html

    この手順を踏むことによって、ドキュメント中の各ページのURIは一定のURIに書き換えられ、
    フレンドリーURLによる各ページへのアクセスはそのURIにリダイレクトされるようになります。
     ・サイト名(0)=ホーム(1)へのアクセス(URI= http://ドメイン/)
      http://ドメイン/
      http://ドメイン/index.html --リダイレクト http://ドメイン/
      その他のフレンドリーURLでアクセスできるURI --リダイレクト http://ドメイン/

     ・カテゴリー(2)へのアクセス(URI= http://ドメイン/folder/)
      http://ドメイン/folder/
      http://ドメイン/folder/index.html --リダイレクト http://ドメイン/folder/
      その他のフレンドリーURLでアクセスできるURI --リダイレクト http://ドメイン/folder/

     ・ページ(3)へのアクセス(URI= http://ドメイン/folder/page.html)
      http://ドメイン/folder/page.html
      その他のフレンドリーURLでアクセスできるURI --リダイレクト http://ドメイン/folder/page.html

    (実際にどのようなURIになるか知りたい場合は、この手順を設定済みの http://phize.net の構成もご参考ください。)


    1.フレンドリーURLの設定を変更  【フレンドリーURLの設定】
      フレンドリーURLの使用: Yes
      フレンドリーURLの接頭辞/接尾辞: なし
      フレンドリーエイリアス: Yes
      エイリアスパスを使用: Yes
      重複エイリアスを許可: No
      自動エイリアスを作成: No

     ※MODx本体のエイリアスの処理が甘いようなので、接頭辞・接尾辞は使わないほうが無難に思います。

    2.ドキュメントのエイリアスは次のように設定  通常のドキュメント: page1.html, page2.html, index.atomなど (拡張子込みで設定する)
     フォルダドキュメント: folder1, folder2など (拡張子なしで設定する)

     ※この例では、フォルダドキュメントのエイリアスは拡張子なしにしていますが、フォルダドキュメントのエイリアスに記号を含めても特に問題ないと思います。

    3.SEO Strict URLsをインストール&設定  http://www.modxcms.com/SEO-Strict-URLs-1335.html

     【プラグインの設定】
      Edit document links: 1
      Rewrite containers as folders: 1
      Check for empty container when rewriting: 1
      Enable manual overrides: 0
      Override TV name: seoOverride

    4.SEO Strict URLsの改造  SEO Strict URLsはエイリアスの処理が少し甘いようで、エイリアスの一部を含む別のエイリアスが(同階層に)ある場合におかしくなります。
     たとえば、同階層に page と page.html という2つのドキュメント(フォルダと通常のドキュメント)があった場合、
     ドキュメント中の http://ドメイン/page.html というURIが、全て http://ドメイン/page/.html に書き換えられてしまいます。
     この問題を回避するために、ファイル名に使える文字が続く場合には、それを含めてエイリアスの照合をするように改造します。

     117行目 $o = preg_replace("#((href|action)=\"|$myDomain)($baseUrl)?($overridePath/)?$overrideAlias$furlSuffix#", '${1}' . $baseUrl, $o);
                                                       ↓
    $o = preg_replace("#((href|action)=\"|$myDomain)($baseUrl)?($overridePath/)?$overrideAlias$furlSuffix([^\w-\.!~\*\(\)])#", '${1}' . $baseUrl . '${5}', $o);
     135行目 $o = preg_replace("#((href|action)=\"($baseUrl)?($overridePath/)?|$myDomain$baseUrl$overridePath/?)$overrideAlias$furlSuffix#", '${1}' . $overrideAlias, $o);
                                                       ↓
    $o = preg_replace("#((href|action)=[\"']($baseUrl)?($overridePath/)?|$myDomain$baseUrl$overridePath/?)$overrideAlias$furlSuffix([^\w-\.!~\*\(\)])#", '${1}' . $overrideAlias . '${5}', $o);
     138行目   $o = preg_replace("#((href|action)=\"($baseUrl)?($overridePath/)?|$myDomain$baseUrl$overridePath/?)$overrideAlias$furlSuffix/?#", '${1}' . rtrim($overrideAlias, '/') . '/', $o);
                                                       ↓
    $o = preg_replace("#((href|action)=[\"']($baseUrl)?($overridePath/)?|$myDomain$baseUrl$overridePath/?)$overrideAlias$furlSuffix(/|([^\w-\.!~\*\(\)]))#", '${1}' . rtrim($overrideAlias, '/') . '/' . '${6}', $o);
     162行目 $o = preg_replace("#((href|action)=\"($baseUrl)?($overridePath/)?|$myDomain$baseUrl$overridePath/?)$overrideAlias$furlSuffix/?#", '${1}' . rtrim($overrideAlias, '/') . '/', $o);
                                                       ↓
    $o = preg_replace("#((href|action)=[\"']($baseUrl)?($overridePath/)?|$myDomain$baseUrl$overridePath/?)$overrideAlias$furlSuffix(/|([^\w-\.!~\*\(\)]))#", '${1}' . rtrim($overrideAlias, '/') . '/' . '${6}', $o);
    5.MODxのトップディレクトリにある.htaccessを修正します。  # The Friendly URLs part
     RewriteCond %{REQUEST_FILENAME} !-f             ←追加
     RewriteCond %{REQUEST_FILENAME} !-d             ←追加
     RewriteRule ^(.*)/index.html$ index.php?q=$1 [L,QSA]   ←追加
     RewriteCond %{REQUEST_FILENAME} !-f
     RewriteCond %{REQUEST_FILENAME} !-d
     RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

    6.完成  これで、フレンドリーURLでアクセスできるURIは所定のURIにリダイレクトされるようになり、各ページのURIは一意のものとなります。
     また、ドキュメント中のサイト内URIを自動的に書き換えてくれるので、スニペット・プラグインによって出力されるURIの差異もなくなります。

    おまけ.mod_rewriteが使えない場合  mod_rewriteが使えず、5の.htaccessの書き換えで対応できない場合、次のような手順で対応できます。

      1.フォルダードキュメントの直下に「エイリアス:index.html」の空ドキュメントを作成します。
      2.ドキュメントの内容に、親ドキュメントへリダイレクトさせるスニペット等のスニペットコールを書いておきます。

      ※DittoやWayFinderのようなリスティング系のスニペット・プラグインを使う場合は、空ドキュメントのリストが出力されないように適宜調整する必要があります。