重写除 URL 的特定部分以外的所有内容

Rewrite everything but specific part of URL

我有这个用户生成的URL:https://example.com/watch.php?name=I9an9O.mp4

我想要实现的是抓住 name=.mp4 之间的部分(即 I9an9O

这就是我希望 URL 的样子:https://example.com/I9an9O

我试过将此代码放入 .htaccess:

RewriteEngine On
RewriteRule ^([^/]*)\.html$ /watch.php?name= [L]

不幸的是,我只能删除 I9an9O 前面的部分,而不能删除 I9an9O 之后的扩展部分。我使用了这个在线 Mod 重写工具:https://www.generateit.net/mod-rewrite/index.php

使用后结果为:https://example.com/I9an9O.mp4.html

我做错了什么?

RewriteRule ^([^/]*)\.html$ /watch.php?name= [L]

不确定为什么要匹配以 .html 结尾的 URL,而您的 URL 应该看起来像 /I9an9O

您需要改为执行以下操作:

RewriteRule ^\w+$ watch.php?name=[=11=].mp4 [L]

\w 是 shorthand 字符 class,仅匹配 upper/lowercase 字母、数字和下划线。因此不会匹配包含点的 URLs(以避免与 watch.php 等实际文件冲突)或包含多个路径段(文件夹)的 URLs。使用更通用的正则表达式 [^/]* (如在您的原始示例中)的问题在于它也可能匹配 watch.php ,从而创建一个无限循环。

[=19=] 反向引用包含与 RewriteRule 模式.

匹配的整个 URL-path

您应该在 HTML 源中链接到 URL 形式 /I9an9O 的链接。

如果您要更改现有的 URL 结构,那么您还需要将 /watch.php?name=I9an9O.mp4 形式的“旧”请求重定向到新的 URL。这个 redirect 需要在上面的重写之前进行。

完整的 .htaccess 文件将如下所示:

Options -MultiViews

RewriteEngine On

# Redirect direct requests to "/watch.php?name=<name>.mp4" to "/<name>"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^name=(\w+)\.mp4
RewriteRule ^watch\.php$ /%1 [QSD,R=301,L]

# Rewrite requests of the form "/<name>" to "watch.php?name=<name>.mp4"
RewriteRule ^\w+$ watch.php?name=[=12=].mp4 [L]

其中第一个 RewriteRule 中的 %1 是对前面 CondPattern 中捕获的子模式的反向引用。 IE。 name=I9an9O.mp4.

I9an9O 部分

QSD 标志对于从请求中丢弃 原始查询字符串是必要的。

首先使用 302(临时)重定向进行测试,然后再更改为 301(永久)以避免潜在的缓存问题。