.htaccess-为Memento配置Apache服务器

.htaccess-为Memento配置Apache服务器,apache,.htaccess,mod-rewrite,memento,Apache,.htaccess,Mod Rewrite,Memento,我尝试配置一个Apache服务器来添加一个指向Mementotimegatesurl的HTTP链接头 我的访问权限: RewriteEngine on RewriteCond %{IS_SUBREQ} false RewriteRule ^/(.*) - [E=ORIGURI:%{HTTP_HOST}/$1] RewriteRule ^/(.*) - [E=ORIGQRY:] RewriteCond %{QUERY_STRING} .+ RewriteRule ^/(.*) - [E=ORI

我尝试配置一个
Apache
服务器来添加一个指向
Memento
timegatesurl的
HTTP链接头

我的访问权限:

RewriteEngine on

RewriteCond %{IS_SUBREQ} false
RewriteRule ^/(.*) - [E=ORIGURI:%{HTTP_HOST}/$1]

RewriteRule ^/(.*) - [E=ORIGQRY:]
RewriteCond %{QUERY_STRING} .+
RewriteRule ^/(.*) - [E=ORIGQRY:?%{QUERY_STRING}]

RewriteRule ^/(.*) - [E=ORIGPROTO:http]
RewriteCond %{HTTPS} on
RewriteRule ^/(.*) - [E=ORIGPROTO:https]

Header always set Link 
    "<http://purl.org/memento/timegate/%{ORIGPROTO}e://%{ORIGURI}e%{ORIGQRY}e>;rel=timegate"

.
.
.
htaccess有什么问题

编辑1

按照Jon Lin的建议删除前导斜杠:

RewriteEngine On
RewriteCond %{IS_SUBREQ} FALSE
RewriteRule ^(.*) - [E=ORIGURI:$1]
RewriteRule ^(.*) - [E=ORIGQRY:]
RewriteCond %{QUERY_STRING} .+
RewriteRule ^(.*) - [E=ORIGQRY:?%{QUERY_STRING}]
RewriteRule ^(.*) - [E=ORIGPROTO:http]
RewriteCond %{HTTPS} on
RewriteRule ^(.*) - [E=ORIGPROTO:https]
Header always set Link "<http://purl.org/memento/timegate/%{ORIGPROTO}e://%{ORIGURI}e%{ORIGQRY}e>;rel=timegate"
重新编写引擎打开
RewriteCond%{IS_SUBREQ}FALSE
重写规则^(.*)-[E=ORIGURI:$1]
重写规则^(.*)-[E=ORIGQRY:]
重写cond%{QUERY_STRING}+
重写规则^(.*)-[E=ORIGQRY:?%{QUERY\u STRING}]
重写规则^(.*)-[E=ORIGPROTO:http]
在上重写cond%{HTTPS}
重写规则^(.*)-[E=ORIGPROTO:https]
标题始终设置链接“rel=timegate”
服务器发送的新响应:

Link <http://purl.org/memento/timegate/http://(null)>;rel=timegate
链接;rel=时间门

正如我们可以看到的那样,解析的是协议,而不是url的其余部分,还有其他建议吗?

您的规则具有此模式
^/(.*)
,如果规则位于htaccess文件中,则该模式将永远不匹配。在htaccess文件中应用规则时,Mod_rewrite会从URI中去掉前导斜杠。删除模式中的前导斜杠:

RewriteRule ^(.*) - [E=ORIGURI:%{HTTP_HOST}/$1]

等等。

为Memento配置Apache服务器

1。使用.htaccess的HTTP标头

RewriteEngine On

RewriteRule ^(.*) - [E=ORIGPROTO:http]
RewriteCond %{HTTPS} on
RewriteRule ^(.*) - [E=ORIGPROTO:https]
RewriteRule ^(.*) - [E=ORIGURI:%{HTTP_HOST}]
RewriteCond %{THE_REQUEST} \s/+([^\s?]+)
RewriteRule ^ - [E=ORIGQRY:%1]

Header always set Link "<http://purl.org/memento/timegate/%{ORIGPROTO}e://%{ORIGURI}e%{ORIGQRY}e>;rel=timegate"
重新编写引擎打开
重写规则^(.*)-[E=ORIGPROTO:http]
在上重写cond%{HTTPS}
重写规则^(.*)-[E=ORIGPROTO:https]
重写规则^(.*)-[E=ORIGURI:%{HTTP_HOST}]
RewriteCond%{THE_REQUEST}\s/+([^\s?]+)
重写规则^-[E=ORIGQRY:%1]
标题始终设置链接“rel=timegate”
见:

2。使用PHP的HTTP头文件

   function get_canonical_url($proto='http://'){
        $canonical_url = $proto;
        if($_SERVER["SERVER_PORT"] != "80") {
                $canonical_url .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] .  $_SERVER["REQUEST_URI"];
        } 
        else {
                $canonical_url.=$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
        }
        return $canonical_url;
    }

    header('Link: <'.get_canonical_url().'>; rel="canonical"');
函数get_canonical_url($proto='http://'){ $canonical_url=$proto; 如果($\服务器[“服务器\端口”!=“80”){ $canonical_url.=$服务器[“服务器名称”]。:“$服务器[“服务器端口”]。$服务器[“请求URI”]; } 否则{ $canonical_url.=$_服务器[“服务器名称”]。$_服务器[“请求URI”]; } 返回$canonical_url; } 标题('Link:;rel=“canonical”');
参考资料:

谢谢,新链接现在是<应该是<你能提供更多建议吗?
   function get_canonical_url($proto='http://'){
        $canonical_url = $proto;
        if($_SERVER["SERVER_PORT"] != "80") {
                $canonical_url .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] .  $_SERVER["REQUEST_URI"];
        } 
        else {
                $canonical_url.=$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
        }
        return $canonical_url;
    }

    header('Link: <'.get_canonical_url().'>; rel="canonical"');