如何在 htaccess 中执行 30x 重定向,但仅限于以此开头的 URL:
http://example.com/x/*
我想将这些重定向到(HTTPS):
https://example.com/x/*
- 如通配符,例如:example.com/x/batman
我不希望重定向影响此域上的任何其他 URL。
我可以使用 PHP 进行此重定向,但我的理解是,如果我在文件中执行此操作.htaccess
,速度会稍微快一点,因为无需执行 PHP。对吗?基本上,我试图以最快的速度进行直接操作。
这是我目前所拥有的,但并不多。它确实有效,并且成功将 https 重定向到 http,但我需要它仅适用于遵循上述模式的特定 URL:
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{ENV:HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
答案1
RewriteCond %{ENV:HTTPS} on RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
要匹配以 开头的特定 URL 路径,/x/
请将 改为RewriteRule
(^x/
无斜线前缀)。例如:
RewriteRule ^x/ http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
测试前您需要清除浏览器缓存。(因此,先使用临时 302 重定向进行测试会更容易。)
不过,关于您的指令有几点需要注意...
这显然是从 HTTPS 重定向到 HTTP - 与您之前的示例中所述相反(并且在 2019 年非常不推荐)?!
使用
HTTPS
环境变量(即%{ENV:HTTPS}
)是非标准的。想必这是根据您主机的指示?
https://example.com/?wildcard
重定向至http://example.com/wildcard
这RewriteRule
图案(例如^x/
以上)仅与 URL 路径匹配 - 明显排除了 URL 的查询字符串部分。
为了匹配查询字符串,您需要一个RewriteCond
(状况) 与服务器变量匹配的指令QUERY_STRING
。
例如,要重定向example.com/?foo
到example.com/foo
,您可以执行以下操作:
RewriteCond %{QUERY_STRING} ^(foo)$
RewriteRule ^$ /%1 [QSD,R,L]
其中%1
是最后一个匹配条件中第一个捕获组的反向引用。请注意,上例中没有 URL 路径(用正则表达式 表示^$
)。QSD
需要 (Query String Discard) 标志来从重定向 URL 中删除查询字符串。
如果你想要一个更“通配符”的变体(匹配任何事物在查询字符串中),正如您在示例中所建议的那样,然后是类似以下内容:
RewriteCond %{QUERY_STRING} ^(.+)$
RewriteRule ^$ /%1 [QSD,R,L]
请注意,R
没有状态代码的标志默认为 302(临时)重定向。