ディレクトリをクエリ変数として書き換える .htaccess ルール

ディレクトリをクエリ変数として書き換える .htaccess ルール

当サイトでは以下のスキーマを使用しています。

example.com/channels/channel_name?v=videoId

channel_name次のようにディレクトリをキャプチャしてクエリ変数として書き換えられるようにしたいと思います。

example.com/channels?watch=channel_name&v=videoId

.htaccess変換をユーザーから隠しながら、末尾のパラメータ変数を保持する正しい構文は何でしょうか?

答え1

example.com/channels?watch=channel_name&v=videoId

このリクエストを実際に処理するスクリプト (フロント コントローラーなど) を特定していないため、ここで何をしようとしているのかがまだ正確にはわかりません。URL パラメーターを読み取り、最終的にコンテンツを提供するスクリプトの名前は何ですか?

はファイルシステム上の物理ディレクトリであると述べています/channels(したがって、URL パスは少なくともスラッシュで終わる必要があります (つまり、 ) /channels/?watch=channel_name&v=videoId)。したがって、これは厳密には書き換えの有効なエンドポイントではありません (実際に何かを行うスクリプトへの追加の書き換えが依然として必要であるため)。次の形式にする必要があります (PHP を想定)。

example.com/channels/front-controller.php?watch=channel_name&v=videoId

front-controller.phpリクエストを実際に処理するスクリプト(つまり、フロントコントローラ)。

この書き換え ( から ) を実現するには、/channels/channel_name?v=videoIdルート ファイルで次のような操作を実行します.htaccess

RewriteEngine On

RewriteCond %{QUERY_STRING} ^(v=videoId)$
RewriteRule ^channels/([\w]+)$ channels/front-controller.php?watch=$1&%1 [QSA,L]

ここで、 は、、のchannel_name文字で構成されます(これはサンプル URL をカバーします)。a-zA-Z0-9_

/channels/front-controller.phpは、実際にリクエストを処理してコンテンツを返すスクリプトです。これはどこにでも置くことができますが、/channelsディレクトリ内に置く必要はありません (実際、潜在的な競合を避けるために、ディレクトリ内に置かない方が簡単です)。

%1前のキャプチャされたグループへの後方参照です条件パターン. つまり、値v=videoId. 繰り返しを省きます。

これは内部書き換え- ユーザーに表示される URL は のままです/channels/channel_name?v=videoId

回避策があります:

RewriteRule ^channels/(.*)$ /watch/?channel=$1 [R=302,NC,QSA,L]

これは外部リダイレクト- ユーザーに表示される URL が新しい URL に変更されます。この場合、どのファイルがリクエストを処理しますか? パラメーターはv=videoId必須ではありませんか?

関連情報