質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.92%

【技術名求む】IDによってページを振り分ける場合、「?引数名=値」を使いたくない

受付中

回答 10

投稿

  • 評価
  • クリップ 7
  • VIEW 3,311

score 1873

 質問概要

teratailやニコニコ動画、Twitterの様に、新しいページができた時に、
http://xxxx.org/?id=0000
などではなく、
http://xxxx.org/0000
のように指定できるようにする技術はどうやっているのか、また技術名を知りたい。

 質問詳細

概要とほぼ一緒なのですが、新しいページができた時に、
http://xxxx.org/?id=0000
などではなく、
http://xxxx.org/0000
のように指定できるようにしたいと考えています。

現段階では、PHPを使っており、
<a href="~~.php?id=0000"></a>のようにIDを渡して、ページに表示する内容を変えております。
しかしあまり見た目的には綺麗ではないので変えたいと思っているのですが、技術名がわからず困っております。
自身的には勝手に、テンプレートエンジン的なもので、HTMLを生成しているのかな?と思っていたりしますが……

申し訳ありませんが、ご存知の方がいらっしゃいましたらご教授ください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 10

+7

質問にある内容は技術名というよりはURLの書式名と言ったほうがふさわしいかもしれません。

アクセスしたいリソースのユニーク名を、

  • QUERY_STINGで指定するか(?属性名=属性値)
  • ディレクトリパスの形式で指定するか
    ※指定されているディレクトリパスの情報が PATH_INFO です。

というURLの書き方である、ということです。

そして、受け取ったURLを、HTTPのリダイレクトを利用して取得させるなら 

  • HTTPリダイレクト

でしょうし、サーバ内部処理で解決するなら

  • URLリライト や
  • URL ルーティング

と呼ばれる処理(技術名)となります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/28 21:44

    ちなみに PATH_INFO とよばれている理由はhttpd(apache)での設定名、環境変数名がPATH_INFOだからですね。

    キャンセル

  • 2016/08/03 12:14

    ご回答有り難うございます!
    なるほど……再読み込みをさせたくないので、今回の場合ですと「URLリライト」になるんですかね?
    URL ルーティングは……初めて聞きました。

    キャンセル

  • 2016/08/03 12:29

    多分、特に「これ」という定義はなくて、httpd でmod_rewrite で設定するから「リライト
    」と言いますし、各種(特にMVCモデルをとっている)フレームワークで捜査対象のモデル/アクション/パラメータを指定された際の動作コントロールを「ルーティング」と言うのでそう言っている、という程度の慣習だと思います。

    まあ、それぞれをキーワードに検索すると色々な情報が出てくるのは確かです。

    キャンセル

+7

英語ではSemantic URL(あえて訳せば「意味的URL」)と呼ばれるようです。その他の呼び名として、綺麗なURL(clean URLs)、RESTfulなURL(RESTful URLs)、ユーザーフレンドURL(user-friendly URLs)、SEO対策URL(search engine-friendly URLs)でしょうか(訳語は適当)。日本語の文献では「クリーンURL」と言われることの方が多いみたいですが、訳語が安定しているようでは無いようです(そのためなのか、日本語版Wikipediaのページはまだありません)。具体例は、リンク先のWikipediaを見てください。

これは形式であり、実現方法の技術のことではありません。実現するための具体的な技術としては、下記のようなモノがあります。(これ以外にもあるかもしれません)

  1. 単純に"index.html"等をすべて用意する。例: Middleman: きれいな URL (ディレクトリインデックス))
  2. mod_rewrite等を使用して書き換え、アプリ内部でPATH_INFO等を見る。例: CakePHP: インストール#Apache
  3. Webアプリそのものがルーティングする。例: Sinatra: README (Japanese)#ルーティング(Routse)
  4. JavaScriptのHistory.pushState()を用いてクライアントサイドでルーティングする。例: JS軽量クライアントサイドルーティングライブラリいろいろ - Qiitaであげられている各JSライブラリ

どれが優れているとかでは無く、言語やフレームワーク、環境によって、できるできない、しやすいしにくい、があります。静的コンテンツは1、PHPやCGIのように置くだけの動的コンテンツは2、RailsやPlayなどのWebアプリ自体でルーティングできるのであれば3、最近流行りのクライアントサイドルーティングをする場合は4といった感じでしょう。


PHPでどう実現したら良いのかは、LaravelCakePHPのソースコードを参考にすると良いと思います。もっとぶっちゃけていうと、これらのフレームワークを使った方が早いと気付く思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/03 12:19

    ご回答有り難うございます。

    1~4の中で、1と4のみ考えておりましたが……1は変更がめんどいですね。
    現段階での知識でやるのであれば、4ですか。
    2,3は調べてみます。

    >PHPでどう実現したら良いのかは、LaravelやCakePHPのソースコードを参考にすると良いと思います。もっとぶっちゃけていうと、これらのフレームワークを使った方が早いと気付く思います。
    実際、この質問を基にフレームワークというものを使ってみようかなと思ったのですが、そもそもこいつらは何をしてくれるもので、PCを変えてもこうかが持続してくれるのかが謎で手が出せていません……
    当方、DropBoxで様々なPCにデータを共有しているので……
    でもはじめなきゃなぁ……フレームワーク

    キャンセル

+3

そういえば、特定の技術名ついてない気がしますね。

URL Rewrite とかかな、
フレームワークとかだとApacheのmod_rewriteというモジュールで設定しますね。

あとは、Clean URLとか言ってるのもあるみたいですよ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/28 14:19

    ご回答有り難うございます。

    名前…無いんですね……
    しかもPHPからなどでは設定できないんですね……

    キャンセル

+3

技術名というよりは、QUERY_STRINGかPATH_INFOかといった感じでしょうか。

QUERY_STRING

http://example.com/?id=0000

PATH_INFO

http://example.com/0000

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/28 14:20

    ご回答有り難うございます。
    PATH_INFO!調べてみます

    キャンセル

  • 2016/07/28 14:36

    ・存在しないURLへのアクセスを固定のPHPに処理させる設定を入れる
    ・PATH_INFOを取得して、あとは好きな様に調理

    http://d.hatena.ne.jp/minesouta/20081126/PATH_INFO

    キャンセル

  • 2016/07/28 14:37

    すみません、固定のPHPと書いておいてリンク先はPerlでした。
    固定のCGIと読み替えてください。

    キャンセル

+2

URLのみで申し訳ございませんが

おそらく
このサイトを参考に組み込めば実現できます
http://www.hoge256.net/2008/04/119.html

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/28 14:19

    ご回答有り難うございます。
    URL先を拝見しました。
    この逆の処理を行いたいのです……

    キャンセル

+1

まああえて言えば「静的URL偽装」でしょうね

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/28 14:20

    ご回答有り難うございます。
    「あえて」なんですね

    キャンセル

+1

きれいにまとめてくれているページ

Apacheのhttp.confを設定できる場合の簡単な例
1. アクセスがあったら何でもかんでもURLをリライトするように設定して、一つ(もしくは特定複数)のphpに処理を集めます。
2. そのPHP内では、ドメイン以降の文字列を$_SERVER['REQUEST_URI']で参照できます。マニュアル
3. これを「1」のphpの中で自力で分解して解析し、必要な処理を特定します。
4. 最終的に呼び出すべきphpをincludeするなりして、目的のページを表示します。

フレームワークには処理をあらかじめ準備してくれていて、書式に従って記述するだけで実現できるものがあります。
呼称は皆さんおっしゃるようにpath_infoとかですかね。
フレームワークのマニュアルを眺めてそれらしい項を参照すれば使い方が見つかるんじゃないかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/03 12:16

    ご回答有り難うございます!

    まだしっかり見ていませんが、おおこれは!
    なんとなく簡単にできそうな気配が!
    今少し時間がないので、後日ゆっくり拝見させていただきます。

    キャンセル

0

技術名は HTTP リダイレクトです。
サーバーの設定や .htaccess で行うのが普通です。

存在しない URL を求められた時に表示するページを指定できるなら、PHP でもできます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/28 21:40

    場にそぐわないのでやめましょう。

    キャンセル

  • 2016/07/28 21:42

    kaz.Suenaga さんに同意します。

    キャンセル

  • 2016/07/28 22:30

    非礼を詫びるつもりはないことは理解しました。これ以上は言いません。

    キャンセル

0

ぱっと見だと、REST っぽく見えます。
REST を意識してデザインすると、そんなURLになってきます。
http://www.restapitutorial.com/lessons/restfulresourcenaming.html

RESTそのものはもっといろいろあーだこーだ定義がついてまわるみたいですが、URL設計という側面だけをとらえて「REST的なURL」といってもよさそう。
https://www.ibm.com/developerworks/jp/webservices/library/ws-restful/

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/28 21:28

    もうすでにマイナスがついていますね。応援の意味であげておきます。

    キャンセル

  • 2016/07/28 21:38

    RESTについてはPATH_INFOとの関係でいうと因果関係が逆に思います。

    RESTがまとめられるより前からPATH_INFOを使ったURL書式やアプリ実装手法は存在しました。

    RESTについては、WebをDB的に扱うにあたって、

    ・SELECT/INSERT/UPDATE/DELETEをHTTPのGET/POST/PUT/DELETEに対応させたこと
    ・リソースの指定にPATH_INFOを利用したこと
    ・その際、コレクションと特定のリソースの関係を /コレクション/リソース識別子/ という書式にしたこと

    といった「技術的特徴がある特定の技術」と解釈すべきかなと。

    キャンセル

  • 2016/07/28 22:21 編集

    そうなんですよね、そもそもRESTは技術ではなくてデザインの一つだし、時間軸も逆だし、と思ったので、「~ぽく」とか「~的」とかいう表現になってしまっています。
    しかし、質問者がいっているURLで反応するような仕掛けをPHPで提供するためのフレームワークを探すのに、「PHP REST」で検索する価値はありそうだと思ったので回答しています。ビンゴな回答ではないというご指摘はそのとおりだと思います。

    キャンセル

  • 2016/08/03 12:15

    ご回答有り難うございます!

    REST……聞いたことはありますが、きっちりと意味を理解していません。
    調べてみます

    キャンセル

0

ApacheのRewrite機能を使えば、やりたいことは実現できると思います。

参考)PHPで動的URLを静的URLに変換するには
http://oshiete.goo.ne.jp/qa/4127921.html

Rewrite機能
Rewrite機能とは、アクセスのあったURLを、正規表現で書き換えてから処理する機能です。
http://rfs.jp/server/apache/02apache/url_rewrite.html

例えば、Blogなど、プログラム呼び出しのURLを書き換える
下記の例では、/cgi-bin/abcSPa_1-b_2.htmlというURLを、/cgi-bin/abc.cgi?arg=a_1-b_2に書き換えます。
※([a-z_]+)が$1に入り、(.+)が$2に入ります

RewriteEngine on
RewriteBase /cgi-bin
RewriteRule ([a-z_]+)SP(.+)\.html$  $1.cgi?arg=$2
[T=application/x-httpd-cgi,L]

ご質問の例であれば、
<a href="http://xxxx.org/id0000"></a>
・・・
<a href="http://xxxx.org/id9999"></a>

RewriteEngine on
RewriteBase /
RewriteRule id([0-9]+)$  $index.cgi?id=$1
[T=application/x-httpd-cgi,L]

http://xxxx.org/id0000 を http://xxxx/org/index.cgi?id=0000
にApacheのRewrite機能がURLを変換して処理してくれます。

あとは、このあたりも参考になりそうですね。
http://kana-lier.com/web/redirect/

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/03 12:20

    ご回答有り難うございます。

    えーっと……
    申し訳ないのですが、

    http://xxxx.org/id0000http://xxxx/org/index.cgi?id=0000
    ではなく、
    http://xxxx/org/index.cgi?id=0000http://xxxx.org/id0000
    にしたいんです……

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る