我有一个 Joomla 网站,我试图使用查询进行 URL 重定向,因此当有人输入
https://example.com/index.php/news/item/some-news
他们被重定向到
http://new.example.com/index.php/news/item/some-news
我试过这个代码,但是不起作用
RewriteCond %{HTTP_HOST} =example.com [NC]
RewriteCond %{QUERY_STRING} (news/item)
RewriteRule ^$ http://new.example.com/?%{QUERY_STRING} [R=301,L]
答案1
https://example.com/index.php/news/item/some-news
您发布的两个示例 URL 中都没有查询字符串,因此尝试匹配QUERY_STRING
服务器变量肯定会失败。您还尝试匹配空的URL 路径(即^$
) - 因此这将从一开始就失败。您尝试匹配的 URL 部分似乎附加路径名信息(又称“路径信息”)。换句话说,即现有文件名后的附加 URL 路径。
然而,奇怪的是,您似乎试图重定向到RewriteRule
指令中的查询字符串?您还重定向到HTTP
(来自HTTPS
) - 这是故意的吗?
在 Apache 上,你可以检查PATH_INFO
服务器变量,也可以简单地将其作为正常 URL 路径的一部分进行匹配,方法是使用RewriteRule
图案。因此,以下任一方法都可以:
RewriteCond %{HTTP_HOST} =example.com [NC]
RewriteCond %{PATH_INFO} ^/news/item/
RewriteRule ^index\.php http://new.example.com%{REQUEST_URI} [R=302,L]
或者,
RewriteCond %{HTTP_HOST} =example.com [NC]
RewriteRule ^index\.php/news/item/ http://new.example.com%{REQUEST_URI} [R=302,L]
根据您的指令,此重定向的条件仅仅是匹配/index.php/news/item/<anything>
。并重定向到目标域上的相同 URL 路径。
这是一个 302(临时)重定向。只有在确认其正常工作后才可将其更改为 301(永久)重定向。这是为了避免浏览器在测试时缓存错误的重定向。
您需要在测试之前清除浏览器缓存。