首先,.htaccess
配置一个 HTTP 服务器来处理incoming请求,资源请求your服务器,而不是外部服务器。但既然你已经明确要求.htaccess
重定向外部链接的方法,我将概述三种方法:
- Use
.htaccess
and mod_substitute
将页面上的所有外部链接替换为固定的内部链接。
- 使用 PHP 和输出缓冲将所有外部链接替换为内部链接。
- 使用 JavaScript 在点击时将外部链接重定向到内部链接。
所有方法都有优点和缺点。
1. .htaccess
and 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
and yourdomain.com
将被视为外部)。
- 您必须使用具有以下功能的 Apache HTTP 服务器:
mod_substitute
loaded.
2. PHP 和输出缓冲
如果您已经使用 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
method:对替换的更多控制。您可以使用以下命令从替换中排除多个内部域preg_replace_callback
与检查链接中实际域的回调结合使用。此外,替换的URL不必是固定的。
3. 使用 JavaScript 重定向
下面的 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
event.
相比之下的优势.htaccess
method:与上述 PHP 方法相同。
缺点:用户必须启用 JavaScript,因此不能保证始终有效。