重写除 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(永久)以避免潜在的缓存问题。
我有这个用户生成的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
模式.
您应该在 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(永久)以避免潜在的缓存问题。