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

如何使用.htaccess将任何外部链接重定向到特定的url格式?,.htaccess,redirect,.htaccess,Redirect,我想重定向所有外部链接,即http://www.someothersite.com/anything在我的网站上(比如http://www.example.com)至http://www.example.com/something 这里我面临的问题是如何处理http://www.someothersite.com/anything因为它的值不是固定的。它可能来自任何不同的领域 首先,.htaccess配置一个HTTP服务器,用于处理传入请求、服务器上的资源请求,而不是外部请求。但由于您明确要求采

我想重定向所有外部链接,即
http://www.someothersite.com/anything
在我的网站上(比如
http://www.example.com
)至
http://www.example.com/something


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

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

  • 使用
    .htaccess
    mod_substitute
    将页面上的所有外部链接替换为固定的内部链接
  • 使用PHP和输出缓冲将所有外部链接替换为内部链接
  • 使用JavaScript在单击时将外部链接重定向到内部链接
  • 所有的方法都有优点和缺点

    1.
    .htaccess
    mod\u 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"
    
    这将阻止PHP将页面内容直接发送到浏览器,但会将所有内容写入内部缓冲区。在脚本结束时,将执行回调,并可能在将其发送到浏览器之前修改该缓冲区的内容

    .htaccess
    方法相比的优势:
    对替换的控制更多。您可以使用
    preg\u replace\u 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);
    })();
    
    (函数(){
    功能重定向链接(evt){
    var matches=/^https?:\/\/([^\/]+)\//i.exec(this.href);
    if(匹配项和匹配项[1]!=“www.yourdomain.com”){
    window.location.href=http://www.yourdomain.com/your-fixed-link';
    evt.preventDefault();
    返回false;
    }
    }
    var links=document.getElementsByTagName('a'),i;
    对于(i=0;i
    只需确保此代码放在所有链接之后(例如文档末尾),或在
    DOMContentLoaded
    事件上执行即可

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


    缺点:用户必须启用JavaScript,因此这不能保证始终有效。

    实际上,我认为目标是首先尝试阻止外部链接离开网站,据我所知,这是无法做到的。。。至少不是通过.htaccess。事实上,我的网站上有这些网站的链接。现在我想要的是,当用户点击该外部站点的链接时,我希望该用户被重定向到
    http://www.example.com/something
    (已修复)这就是我想要的@wheatbeak,您可能可以通过javascript实现,但不能通过.htaccess。不管服务器端设置如何,外部链接都将正常工作。注意:在javascript中执行此操作可能会对站点性能产生严重影响,尤其是当您有大量链接时。@RyanVincent OP表示如果他们的站点有指向您的域的链接,并且用户单击,他们根本不希望用户跟随链接,而是重定向。
    (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);
    })();