サポート » 使い方全般 » サブディレクトリのトレイリングスラッシュ

  • 解決済 kuroara

    (@kuroara)


    始めまして。疑問に思うことがあり、調べたのですが分からないので、皆さんのご意見をお聞かせ下さい。

    サブディレクトリを指定してWordPressをインストール、そのままサブディレクトリをサイトトップにしています。

    一般設定は以下のようにしています。
    WordPress アドレス (URL):http://example.com/wp
    サイトアドレス (URL):http://example.com/wp

    1 一番最後にスラッシュは付かないので、home_url()などでURLを出すと、URLにはスラッシュが付いていません。
    2 実際に http://example.com/wp にアクセスすると、http://example.com/wp/ とスラッシュが付いたアドレスになります。

    1と2は矛盾しているように思うのですが、インストール時の設定などがわるかった訳ではなく、「こういうもの」でしょうか?皆さんもこうなりますか?

    2の、実際のアドレスのスラッシュを外すことはできますか?と言うのも、プラグインで自動送信メールされるものを使っていて、そこに記載されるURLが http://example.com/wp とスラッシュなしなので、実際のURLと違い少し気になります。
    これをスラッシュありが出るようになっても良いのですが、一般設定のところでスラッシュを付けて保存しても反映されません。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • 多くのウェブサーバーでは、ファイルが見つからない場合には自動的にURLの終わりに「/」(スラッシュ)を付けて表示を試みるようになっているので、http://example.com/wp にアクセスをした時、「wp」というファイル名が見つからない場合には、結果的に「wp/」としてページが表示されることになります。
    固定ページで「wp」を作る。その動作がどうなるかしら。

    「/」(スラッシュ)のあり・なしとでは、ウェブサーバーが探しに行くファイルが異なります。名前の後ろにスラッシュが付いていると「ディレクトリ」を表し、後ろにスラッシュが付いていないと「ファイル」を表します。
    なので、一見同じように見えるURLも「/」(スラッシュ)のあり・なしとでは全く別のページとして扱われることになります。

    .htaccess ファイルの記述を注意されるとよいでしょう。

    1 と 2 は、ちょっと違う機構です。

    1 は、WordPress の仕様であって、何も手を加えていなければ、全てのインストールで同じ状態になるはずです。

    WordPress は、siteurl、home というオプションデータを持っていて、prefix_options というデータベース・テーブルにその値を保存しています。テンプレート・タグの site_url() や home_url() を使うと、内部で get_option(‘siteurl’) や get_option(‘home’) を呼び出して、テーブルからデータを読み込みます。この URL は、保存するときに必ず最後のスラッシュを削除した形に整形されます。ですから、設定->一般で、スラッシュを追加しても変更することはできません。

    Apache などの DocumentRoot の指定方法にならっているような感じですね。ルートはスラッシュなし、それより後は、GET 要求でつけるパスと同じように扱えということではないかな。ルートへの要求は GET / HTTP/1.0 だから。

    保存されたデータは、しかるべき関数を使えば、変更することもできますが、お勧めはしません。WordPress 内部でも、プラグインやテーマでもさまざまに使われているからです。まあ、二重スラッシュが飛び交うだけといえば、そうなのですが… 気持ち悪いですよね。

    テンプレート・タグは、オプションの引数を受け取ることができて、指定の仕方によって、下のような違いがあります。

    site_url()                 => http://example.com/wp
    site_url('/')              => http://example.com/wp/
    site_url('/somepage/')     => http://example.com/wp/somepage/
    site_url('anotherpage/')   => http://example.com/wp/anotherpage/
    site_url('yetanotherpage') => http://example.com/wp/yetanotherpage

    こういう仕様なわけです。これが WordPress のあちこちで使われています。

    2 の方は、サーバ設定によって、振る舞いが変わることがありますが、通常は以下のようになります。

    ブラウザから http://example.com/wp へ GET 要求を出すと、wp というディレクトリがある場合、サーバは、http://example.com/wp/ へのリダイレクトを送信します。Apache、Nginx ともにこれがデフォルトの振る舞いのはずです。そして、http://example.com/wp/index.php があれば、PHP (または、php モジュール) が実行されて、WordPress が動き出します。ということは、この場合、最後のスラッシュをつけているのは、Apache や Nginx であって、WordPress がつけてるわけじゃありません。

    どうしてもこの動作を変更したいとうことなら、止めはしませんが、お勧めもしません。Apache なら、mod_dir を、Nginx なら、設定ファイルの server セクションの記述を調べてみてください。うまくいかない場合は、Apache または Nginx のフォーラムかメーリングリストでお願いします。

    さて、お使いのプラグインですが、http://example.com/wp/ を送信するのが本当は正しいやり方だと思います。サーバのリダイレクトとブラウザとのやり取りは一瞬で終わるので、どうということはないですが (ディレクトリには必ずスラッシュをつけろ、と昔は言われましたけど)、サーバに余計な仕事をさせないことは確かだからです。WordPress は仕様どおり動いているので、まったく問題ありません。

    トピック投稿者 kuroara

    (@kuroara)

    맹조さん、kjmtshさん、ご回答ありがとうございます!

    なるほど、あまりにも一瞬なのでわかりませんでしたが、サーバーがご丁寧にリダイレクトしてくれていた訳ですね。

    ルートURLの場合はリダイレクトしないですし(私のサーバーは)、色々ネットにある「サブディレクトリのWordPressをルートURLにする方法」を見てもスラッシュが付いていなかったので、混乱していました。ルートURLとサブディレクトリの挙動は違うようですね。

    WordPress側がスラッシュ付きを標準にしてくれたら良いような気がしていたのですが、ルートの扱いなどなどでそういう仕様になっているのですね。1について詳しく説明していただいてよくわかりました。ルートURLの場合にスラッシュが付いても困りますし、なるほどです。

    スラッシュは無くても良いかと思っていたのですが、サーバー側がそうすると言うならそれに従います。

    プラグイン側で、スラッシュが付くようにしてみようと思います。
    基本はサブディレクトリにはスラッシュが付く!と覚えておきます。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • トピック「サブディレクトリのトレイリングスラッシュ」には新たに返信することはできません。