.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可以由字符a-zA-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不是必需的吗?

相关内容