当サイトでは以下のスキーマを使用しています。
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-z
A-Z
0-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
必須ではありませんか?