我们的网站使用以下架构:
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
可以由字符a-z
、A-Z
和组成0-9
(_
涵盖您的示例 URL)。
/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
不是必需的吗?