We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 19033
    • 892 Posts
    こんにちは。よろしくお願いいたします。
    ちょっと複雑な事例かもしれないのですが。。

    具体的には、以下のような場合なのですが。
    http://www.liolion.info/modx/modxsample/blog-like/20070903.html

    上記のドキュメントはフォルダです(以下にgooglmap のマーカードキュメントを格納しています)。
    でも、普通のドキュメントとして見せたいので、URIを「/エイリアス/」ではなく、「/エイリアス.html」として
    表示しています。

    そのようにしたい場合、「SEO Strict URLs」プラグインを導入している場合は、以下の二つが考えられると思います。
    1.接尾辞を.htmlとしたままで、エイリアスに「エイリアス」と入力し、「SEO Strict URLs」のオプションで「Append Extension」を選択する。
     または、
    2.接尾辞をなくして、エイリアスに「エイリアス.html」と入力し、「SEO Strict URLs」のオプションで「BaseName」を選択する。

    上記の2つのうち、今回は、1.で行っています。で、表示上は、問題がないようなのですが、
    フォームで、「送信」の操作をするときに、問題があるようなのです。

    たとえば、上記のドキュメントは、Jotが仕込んであるのですが、Jot の<form action=""> のところのURIが
    「/エイリアス/#jotが吐き出すid番号...(.htmlがない)」というふうになっているのが原因?で、送信ボタンをクリックしても
    反応しない結果となってしまうのです。。

    ためしに、接尾辞をなくして、「エイリアス.html」とエイリアスに入力し、
    オプションで「base name」を選択してもうまくできませんでした。。

    これは、何か解決策があるでしょうか。。

    あるいは、フォームで送信したいドキュメントのURIを拡張子(.html)つきで表示したいならば、
    「そのドキュメントはフォルダにしない」、という選択が賢明でしょうか。。

    以下の環境で試しました。
    MODx 096
    ・SEO Strict URLs - 1.0.1 および、SEO Strict URLsプラグイン(Phizeさん改造版)
    ・Jot1.1.2 および、eForm 1.4.4 ISO-2022-JP対応版

    どうぞよろしくおねがいいたします。。
      • 36592
      • 970 Posts
      こんにちは~

      Quote from: MEGU at Oct 29, 2007, 10:00 PM

      たとえば、上記のドキュメントは、Jotが仕込んであるのですが、Jot の<form action=""> のところのURIが
      「/エイリアス/#jotが吐き出すid番号...(.htmlがない)」というふうになっているのが原因?で、送信ボタンをクリックしても
      反応しない結果となってしまうのです。。
      多分これが原因っぽいですね... リダイレクトされるとPOSTされたデータが落とされちゃうとかかな?
      でも、どうして

      1.接尾辞を.htmlとしたままで、エイリアスに「エイリアス」と入力し、「SEO Strict URLs」のオプションで「Append Extension」を選択する。
      としてるのに「action=""」のところの型式が「/エイリアス/」になっちゃうんでしょうか?
      Jotのアドレス生成過程に問題ありなんですかね~

      あと、もう1つ気になるのは、
      http://www.liolion.info/modx/modxsample/blog-like/20070903.html
      の上位ページの
      http://www.liolion.info/modx/modxsample/blog-like/
      の中で、9月3日の「旅行1日目」へのリンクがJotのactionパラメータ内と同様に
      http://www.liolion.info/modx/modxsample/blog-like/20070903/
      となっていますね。どうして「・・・/20070903.html」にならないんでしょうか?
      これを生成しているのはDittoですか?
        • 19033
        • 892 Posts
        tkfm さん。ありがとうございます。

        Quote from: tkfm at Oct 31, 2007, 01:01 AM


        1.接尾辞を.htmlとしたままで、エイリアスに「エイリアス」と入力し、「SEO Strict URLs」のオプションで「Append Extension」を選択する。
        としてるのに「action=""」のところの型式が「/エイリアス/」になっちゃうんでしょうか?
        Jotのアドレス生成過程に問題ありなんですかね~

        よくわからないのですが、Jotのアドレス生成には「SEO Strict URLs(のオプション)」が?
        関与してない...?ですよね。これはeFormでも同じなのです(同じ現象が起きてます)。

        あと、もう1つ気になるのは、
        http://www.liolion.info/modx/modxsample/blog-like/20070903.html
        の上位ページの
        http://www.liolion.info/modx/modxsample/blog-like/
        の中で、9月3日の「旅行1日目」へのリンクがJotのactionパラメータ内と同様に
        http://www.liolion.info/modx/modxsample/blog-like/20070903/
        となっていますね。どうして「・・・/20070903.html」にならないんでしょうか?
        これを生成しているのはDittoですか?

        はい。Ditto です。Ditto が吐き出すURIもJotやeFormのactionのとこと同じ(現象?)ってことですよね??
          • 23276
          • 85 Posts
          こんばんは、試してみました。
          確認できた状況としてデータ自体は正しく送信されていますが、POSTメソッドでリクエストが送信された後、再度、リダイレクトされていました。

           20070903#数字(POST/301) -> SEOStrictURLs?MODx?がリダイレクト(?) -> 20070903.html#数字

          うちのMODxのeFormで(おそらく)同じ設定で試してみたら、同じような現象になりました undecided
          HTMLのaction属性値を「~/エイリアス.html」に書き換えるとうまくいきました。

          つまり、action属性のURIと実際のドキュメントのURIが異なる(?)のが原因ということになると思うのですが、
          SEOStrictURLsの設定で、「Rewrite containers as folders」を 0 にしたらうまく動くようになりました。

          「Rewrite containers as folders」(makeFolders)は、「子ドキュメントを持つドキュメントはディレクトリ風のURIに書き換える」という設定(だと思う)なので、
          子ドキュメントを持つドキュメント(20070903)のaction属性値が「/20070903/」となるのは、正しい動作のようにも思います。
          (関連する設定として、「Check for empty container when rewriting」(emptyFolders)がありますが、これは「子ドキュメントを持たないフォルダドキュメントのURIを書き換えるか?」という設定(だと思う)です。)

          フレンドリーURLとSEOStrictURLsの設定、あるいはSEOStrictURLsの設定とドキュメント個別の設定が衝突(?)していることになるのかもしれませんね…
          MODxのURIを生成するmakeUrlメソッドに、接頭辞・接尾辞の処理に不具合があった気がするのでそれも関係しているかもしれません。SEOStrictURLs側で直せそうなら挑戦してみます。
          うちの環境では上記でうまく動作したのですが、もしかしたら他の部分で不具合がでるかもしれませんね undecided


          よくわからないのですが、Jotのアドレス生成には「SEO Strict URLs(のオプション)」が?
          関与してない...?ですよね。これはeFormでも同じなのです(同じ現象が起きてます)。

          「Edit document links」(editDocLinks)が1になっている場合は、(プラグインの処理の順番にもよるかもしれませんが)出力されるURIやhref/action属性値などはSEOStrictURLsによって書き換えられるので、注意が必要かしれません(^^;


          こちらで試したときは、次のような設定で試してみました。

          http://www.liolion.info/modx/modxsample/blog-like/20070903.html

          • フォルダ: Yes
          • エイリアス: 20070903
          • seoOverride: Append Extensionなど

          MODx設定(フレンドリーURL)

          • フレンドリーURLの使用: Yes
          • フレンドリーURLの接尾辞: .html
          • フレンドリーエイリアス: Yes
          • エイリアスパスを使用: Yes
          • 自動エイリアス生成: No

          SEOStrictURLs

          • Edit document links: 1
          • Rewrite containers as folders: 1 (0にするとうまく動作した)
          • Check for empty container when rewriting: 1
          • Enable manual overrides: 1
            • 36592
            • 970 Posts
            こんにちは~

            Quote from: Phize at Oct 31, 2007, 07:20 AM

            フレンドリーURLとSEOStrictURLsの設定、あるいはSEOStrictURLsの設定とドキュメント個別の設定が衝突(?)していることになるのかもしれませんね…

            URLの書き換えはSEO StrictURLsの「OnWebPagePrerender」システムイベントの処理ルーチン内で行っていますよね?
            ざっとプラグインのソースを眺めた感じでは...

            1.TOPページ(site start)のURL書き換え
            2.テンプレート変数で指定した個別ページのURL書き換え
            3.フォルダになっているページの書き換え

            の順で処理されているように見えます。
            この順だと、個別ページでどのURL型式を指定しても、フォルダにしているページは全部「/エイリアス/」になっちゃいませんか?

            個人的には上記の2と3は逆に処理して欲しい(個別ページの指定を優先)気がしますが...

            単純に処理順を入れ替えてもダメでした。
            どうも、全てのURLが「エイリアス.html」の形式になっている前提で「preg_replace」が使われているようです。
            今回の希望は、一旦フォルダの処理で「/エイリアス/」に変換したものを
            再び「エイリアス.html」に戻すロジックになるから、順序を入れ替えただけでは動かないということでしょうか?

            ここから先は私のPHPのスキルではどうにも.. :’(
              • 23276
              • 85 Posts
              こんにちは smiley

              >この順だと、個別ページでどのURL型式を指定しても、フォルダにしているページは全部「/エイリアス/」になっちゃいませんか?
              >個人的には上記の2と3は逆に処理して欲しい(個別ページの指定を優先)気がしますが...

              たしかにそのほうが自然な気がしますね…
              HTMLの書き換えは「OnWebPagePrerender」イベントで、リダイレクトは「OnWebPageInit」イベントで行っているみたいです。

              リダイレクトのときには、

               20070903#数字(POST/301) -> SEOStrictURLs?MODx?がリダイレクト(?) -> 20070903.html#数字

              みたいに~.htmlに直されているっぽいので、HTMLの書き換え時とリダイレクト時の処理の順番が違うんでしょうか(^^;
              SEOStrictURLsは個人的にも一番よく使っているプラグインなので、直せるかどうか挑戦してみます wink
                • 36592
                • 970 Posts
                つたないPHPスキルで適当に修正したら動きました!

                Phizeさんなら多分もっとスマートな書き方ができるでしょうからコードをさらけ出すには気が引けるので、
                変更したロジックだけ書いてみますと...

                「OnWebPagePrerender」の処理の中身について、

                1. 「if ($makeFolders){・・・}」のブロックと「if ($override){・・・}」のブロックの順序を入れ替える。
                2. 「if ($override){・・・}」のブロックの内部の処理について...
                  2-1. 「case 0:」のところの処理で
                        「/エイリアス/」→「/エイリアス」
                        「/エイリアス.html」→「/エイリアス」
                      を行う。
                  2-2. 「case 1:」を新規に作成し
                        「/エイリアス/」→「/エイリアス.html」
                      を行う。
                  2-3. 「case 2:」を削除する。

                としました。

                正規表現を全く理解していないので、書いたコードはあてずっぽです。 tongue
                  • 19033
                  • 892 Posts
                  Phize さん。tkfm さん。どうもありがとうございます。

                  しかし、すでにお話の内容についていけない...。 :’(
                  改造の結果を楽しみにしております。どうぞよろしくお願いします。

                  ちみなみに、「Rewrite containers as folders: 」を変更すると、
                  すべての?フォルダドキュメントについて影響するわけですよね?(やってみました)。

                  基本的には、フォルダドキュメントのURIは「/エイリアス/」でよくって、
                  (ドキュメントごとに)個別に、今回のような事例に対応は可能だろうか。。ということなのです。

                  で、それのお話をされてるのですよね...?(←わかってないかも。。^^;;)
                    • 36592
                    • 970 Posts
                    Quote from: tkfm at Nov 01, 2007, 12:32 AM

                    2-3. 「case 2:」を削除する。
                    よく考えたら、これ削除しちゃダメですね。
                    「/エイリアス.html」→「/エイリアス/」の処理をしないと...
                    フォルダを「/エイリアス/」に変換しないデフォルト設定で、ページごとの設定でフォルダにしたとき処理漏れしますね。

                    Quote from: MEGU at Nov 01, 2007, 02:27 AM

                    基本的には、フォルダドキュメントのURIは「/エイリアス/」でよくって、
                    (ドキュメントごとに)個別に、今回のような事例に対応は可能だろうか。。ということなのです。
                    で、それのお話をされてるのですよね...?(←わかってないかも。。^^;;)
                    そうです。そういう設定です。
                      • 23276
                      • 85 Posts
                      こんばんは smiley

                      >>tkfmさん
                      PHPはまだ勉強を兼ねていじっている程度ですので… lipsrsealed

                      >>MEGUさん
                      全てのドキュメントに影響してしまいますね…

                      tkfmさんの修正はまだ試してないのですが、(バグのせいもあって)接頭辞・接尾辞を使う場合、現在のSEO Strict URLsでは子ドキュメントを持つフォルダをHTMLファイルのように扱うのはそのままでは難しそうです。(文末のリンク先もよろしければご参考ください。)

                      特定のページ(群)のみを例外的なリダイレクトをさせたい場合は、.htaccessでmod_rewriteを使ったほうがわかりやすいかもしれませんね(^^;

                      # こっから追加
                      # modxsample/blog-like/YYYYMMDD/ は全てmodxsample/blog-like/YYMMDD.htmlにリダイレクト
                      RewriteCond %{REQUEST_FILENAME} !-f
                      RewriteCond %{REQUEST_FILENAME} !-d
                      RewriteRule ^(modxsample/blog-like/)([0-9]{4}[0-9]{2}[0-9]{2})/$ $1$2.html [L,R=301,QSA]
                      # ここまで追加
                      RewriteCond %{REQUEST_FILENAME} !-f
                      RewriteCond %{REQUEST_FILENAME} !-d
                      RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
                      

                      [追記] ↑は無限リダイレクトになるかリダイレクトに失敗してしまうかもしれません。難しいですね(^^;

                      自分も前から気になっていたので、一応、現在のSEO Strcit URLs(Phize版ですが…)の挙動をまとめてみました。手前味噌で申し訳ないですが長いのでリンクさせていただきます。

                      http://phize.net/resource/modx/seostricturls_detail.html

                      この他にも、クエリ(?q=15)やドキュメントID(/15/, /15.html etc.)によるアクセスの場合や、フレンドリーURLの設定の組み合わせによっても多少変わってくると思います。
                      それらも調べようかと思ったのですが、いったんここで力尽きました lipsrsealed

                      これを見ると、概して接頭辞・接尾辞を使用している場合、フォルダドキュメントのURIの書き換えとリダイレクト機能がおかしく感じますね…。
                      tkfmさんの修正をする前のものなので、修正後にどうなるかはまだわからないのですが…
                      アクセスできるURIのパターンが多いのでなかなか大変そうなのですが、tkfmさんの調整で直るなら素晴らしいですね laugh
                      せっかくなのでコードもご紹介いただければと思うのですが…(^^;