![使用 mod_rewrite 重定向单个页面](https://linux22.com/image/726698/%E4%BD%BF%E7%94%A8%20mod_rewrite%20%E9%87%8D%E5%AE%9A%E5%90%91%E5%8D%95%E4%B8%AA%E9%A1%B5%E9%9D%A2.png)
第一个要求是将流量从 重定向http://www.old-domain.org
到 https://example.press
—— 但只对域的根执行此操作;任何特定页面都应该在旧域上可用。
所以我做了一些研究,并且这个完成了工作:
RedirectMatch "^/$" "https://example.press"
(有趣的是,https://htaccess.madewithlove.be/声称它不起作用......)
然后,下一个请求进来了:也重定向另一个 URL,形式如下:
http://www.old-domain.example/site/index.php?act=news
,但如果请求任何特定的新闻报道则不会被重定向(例如http://www.old-domain.org/site/index.php?act=news&id=12345
)
Redirect
事实证明,这非常具有挑战性。许多文档和文章都提到,使用/RedirectMatch
指令无法实现这一点,但使用RewriteCond
+指令可以实现RewriteRule
这一点,我总结出它应该是这样的:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{QUERY_STRING} act=news
RewriteRule ^(.*)$ https://example.press [R=302,L]
</IfModule>
(再次,https://htaccess.madewithlove.be/声称有效)
但是,似乎什么都没起作用。没有发生重定向。我有什么明显的误解吗?
答案1
我相信这会起作用:
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{QUERY_STRING} act=news RewriteCond %{QUERY_STRING} !act=news&id=12345 RewriteRule ^(.*)$ https://example.press/ [R=302,L] RewriteRule ^/$ https://example.press/ [R=302,L] </IfModule>
有两条规则,第一条规则有两个条件。第一条规则的第二个条件使用!
运算符来否定匹配act=news&id=12345
。第一条规则的条件之间有一个隐含的“AND”,因此它们都需要为真。
第二条规则/
仅匹配页面,没有任何条件。