2

この質問は、多くの人が尋ねてきたことに打ちのめされていることは承知していますが、ほとんどの回答は、彼らのニーズにのみ合った非常に特定のケースに対するものであるように思われ、これまでのところ、適切な解決策は見つかりませんでした (少なくとも、私が見る限り)。

私の問題は、Web サイトで URL パラメータを ID から実際の文字列にリダイレクトさせようとしていることです。

例えば:

www.example.com/?category=1

次のように表示されます。

www.example.com/software

その間

www.example.com/?category=2

次のように表示されます。

www.example.com/software/desktop

私が読んだことから、私はApacheのrewritemapを調べているはずですが、これが私の混乱の原因です。フラットなtxtファイルからロードする必要はありません。これを可能な限り動的にします。phpファイルから読み取ったり、MySQLデータベースから読み取ったりできることを読みました。これが私の望みです。

それに関する問題は、これを達成するための適切な方法が何であるかがよくわからないことです。RewriteMapドキュメントは、フラットな .txt ファイルのみをカバーしており、MySQL では実現していません。

基本的に私が求めているのは、誰かが私が探しているものを達成する方法を説明できるかどうか、または少なくとも正しい方向に私を向けることができるかどうかです. これまでに見つけたスレッドのほとんどは、悲しいことにまだあまり役に立ちませんでしたが、有用なスレッドを通り過ぎた可能性があります。

それが役立つ場合、現在、MySQL データは次のように継承された構造でフォーマットされています。

 ID |   Title          |   Link             | Parent
  1 | Software         | /Software/         |  NULL
  2 | Desktop Software | /Software/Desktop/ |   1
  2 | Mobile Software  | /Software/Mobile/  |   2

PS: 私が見つけたほとんどのソリューションは、例としてこれを与えることを追加する必要があります:

  RewriteMap examplemap prg:/path/to/file.php
  RewriteRule (.*) ${examplemap:$1}

それでも、その file.php の内容や、値を照会して返す方法に関する情報は決して提供しません。

編集 私は自分のプライベートサーバーではなく、共有ホスティングサーバーにいることに言及する必要があるため、可能なすべてのオプションにアクセスできない場合があります

EDIT 2 わかりやすくするために: 私がやろうとしているのは、「example.com/software」にアクセスするユーザーが「example.com/?category=1」にいるかのように扱われるようにすることです; 基本的にリンクをきれいにして読みやすくします。唯一のことは、データベースから読み取ろうとしているということです

4

2 に答える 2

1

RewriteMapサーバーまたは vhost 構成にアクセスできない場合は、とにかく使用できません。マップ自体は、htaccess ファイルではなく、サーバーまたは vhost 構成で定義する必要があります。しかし、Apache 2.4 には、mod_dbd を使用してSQL クエリを使用して書き換えマップを定義するオプションがあります。

MySQL にアクセスする必要がある場合は、mod_rewrite を使用する代わりに、すべて PHP で行う方がよいでしょう。mod_rewrite を使用して php ファイルにルーティングすると、リダイレクトされます。たぶん、このようなものですか?

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /file.php?link=$1 [L]

したがって、誰かが をリクエストするhttp://example.com/Software/Mobile/と、リクエストは: に書き換えられ/file.php?link=Software/Mobile/file.phpスクリプトが検索を行います。

または、実際にその逆を意味する場合:

RewriteCond %{QUERY_STRING} category=([0-9]+)
RewriteRule ^$ /file.php?ID=%1 [L]

したがって、誰かが をリクエストするhttp://example.com/?category=2と、リクエストは : に書き換えられ/file.php?ID=2、php スクリプトがルックアップを行います。

于 2013-04-02T07:48:52.783 に答える
0

私の提案は、フロント コントローラー パターンの利用を検討することです。ユーザー フレンドリーな URL や「ルート」の概念を理解し始めると、Web サーバー レベルで特定の URL を特定のコントローラーにマッピングすることを心配する必要がなくなるため、フロント コントローラーは本当に単純化できると思います。

Apache をmod_dir有効にしている場合 (そうしている可能性があります)、Apache 構成または で次のようなことを行うことができます.htaccess

FallbackResource /index.php

この単純なディレクティブは、それ以外の場合は 404 エラーの原因となるすべての要求を のフロント コントローラに転送します/index.php

これは、次のようにして行うこともできますmod_rewrite

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php [L,QSA]

フロント コントローラーでは、URI を評価し、要求を処理するために必要な任意のロジックに要求をルーティングできます。これは、データベースからルートを検索するか、ハードコードされたルートの配列などを介して行うことができます。(ただし、データベースを使用している場合は、すばやくアクセスできるようにルートのキャッシュ バージョンを用意することをお勧めします)。

車輪を再発明する必要がないように、さまざまな PHP ルート コントローラーが利用可能です (ほとんどの最新のフレームワークには、何らかのルーティングの概念があります)。

于 2013-04-02T16:05:32.023 に答える