我想将所有外部链接重定向,即我网站中的http://www.someothersite.com/anything
之类的链接(比如http://www.example.com
)重定向到http://www.example.com/something
。
我面临的问题是如何照顾http://www.someothersite.com/anything
因为它的价值不固定。它可能来自任何不同的领域。
答案 0 :(得分:2)
首先,.htaccess
配置一个HTTP服务器,用于处理传入请求,您的服务器上的资源请求,而不是外部请求。但是,由于您明确要求.htaccess
方式重定向外部链接,我将概述三种方法:
.htaccess
和mod_substitute
将您网页上的所有外部链接替换为固定的内部链接。所有方法都有优点和缺点。
.htaccess
和mod_substitute
如果没有对此进行测试,但从理论上讲,它应该可行。
将以下内容放入.htaccess
并将www.yourdomain.com
替换为您的域名:
AddOutputFilterByType SUBSTITUTE text/html
Substitute "s|(<a\s[^>]*)href=\"https?://([^/]+)(?<!www\.yourdomain\.com)/[^\"]*\"|$1href=\"http://www.yourdomain.com/your-fixed-link\"|i"
这会向所有包含HTML内容的请求正文添加一个输出过滤器,并使用正则表达式将每个链接的href
属性中的任何外部网址替换为您的固定网址。
<强>缺点:强>
sub2.yourdomain.com
,yourdomain.com
将被视为外部域名。)mod_substitute
的Apache HTTP服务器。如果您已经使用PHP生成页面,则可以使用回调添加输出缓冲,将外部链接替换为内部链接:
<?php
function replace_links($html)
{
return preg_replace('~(<a\s[^>]*)href="https?://([^/]+)(?<!www\\.yourdomain\\.com)/[^"]*"~i', '$1href="http://www.yourdomain.com/your-fixed-link"', $html);
}
ob_start('replace_links');
// generate page
?>
这将阻止PHP将页面内容直接发送到浏览器,但会将所有内容写入内部缓冲区。在脚本结束时,执行回调并可以修改该缓冲区的内容,然后再将其发送到浏览器。
优于.htaccess
方法的优势:可以更好地控制替换。您可以使用preg_replace_callback
结合回调检查链接中的实际域,从替换中排除多个内部域。此外,替换的URL不必修复。
以下JavaScript可能是您最常用的做法:
(function() {
function redirectLink(evt) {
var matches = /^https?:\/\/([^\/]+)\//i.exec(this.href);
if (matches && matches[1] != 'www.yourdomain.com') {
window.location.href = 'http://www.yourdomain.com/your-fixed-link';
evt.preventDefault();
return false;
}
}
var links = document.getElementsByTagName('a'), i;
for (i = 0; i < links.length; i++)
links[i].addEventListener('click', redirectLink, false);
})();
只需确保此代码放在所有链接之后(例如在文档的末尾)或在DOMContentLoaded
事件上执行。
优于.htaccess
方法的优势:与上述PHP方法相同。
缺点:用户必须启用JavaScript,因此无法保证始终有效。