如何使用.htaccess将任何外部链接重定向到特定的url格式?

时间:2016-03-14 20:04:37

标签: .htaccess redirect

我想将所有外部链接重定向,即我网站中的http://www.someothersite.com/anything之类的链接(比如http://www.example.com)重定向到http://www.example.com/something

我面临的问题是如何照顾http://www.someothersite.com/anything因为它的价值不固定。它可能来自任何不同的领域。

1 个答案:

答案 0 :(得分:2)

首先,.htaccess配置一个HTTP服务器,用于处理传入请求,您的服务器上的资源请求,而不是外部请求。但是,由于您明确要求.htaccess方式重定向外部链接,我将概述三种方法:

  1. 使用.htaccessmod_substitute将您网页上的所有外部链接替换为固定的内部链接。
  2. 使用PHP和输出缓冲将所有外部链接替换为内部链接。
  3. 点击即可使用JavaScript将外部链接重定向到内部链接。
  4. 所有方法都有优点和缺点。

    1。 .htaccessmod_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.comyourdomain.com将被视为外部域名。)
    • 您必须使用加载了mod_substitute的Apache HTTP服务器。

    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方法的优势:可以更好地控制替换。您可以使用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事件上执行。

    优于.htaccess方法的优势:与上述PHP方法相同。

    缺点:用户必须启用JavaScript,因此无法保证始终有效。