0

我尝试配置Apache服务器以添加HTTP Link header指向MementoTimeGates url

我的 htaccess:

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"

.
.
.

不变:http ://www.mementoweb.org/tools/apache/

我正在XAMPP服务器上测试代码,但服务器发送的响应是:

.
.
.
Link    <http://purl.org/memento/timegate/(null)://(null)(null)>;rel=timegate
Server  Apache/2.4.3 (Win32) OpenSSL/1.0.1c PHP/5.4.7
.
.
.

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"

服务器发送的新响应:

Link <http://purl.org/memento/timegate/http://(null)>;rel=timegate

正如我们所看到的,protocole 已被解析,但 url 的其余部分没有被解析,还有其他建议吗?

4

2 回答 2

1

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

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

ETC...

于 2013-12-31T00:56:20.117 回答
0

为 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"

请参阅:htaccess - 如何捕获当前重写的 url?

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"');

资源: http: //moz.com/blog/how-to-advanced-relcanonical-http-headers

于 2013-12-31T15:25:43.673 回答