So. Ich habe inzwischen selber eine brauchbare, wenn auch relativ unelegante, Lösung gefunden:
PHP kann leider keine HTTP-Authentifizierung übernehmen; aber JavaScript (zumindest im Internet Explorer; leider nicht in Opera). Hier die vollständige Lösung mit serverseitiger Browserweiche:
Erzeugung des Links in PHP auf "Server 1":
if (strstr($_SERVER['HTTP_USER_AGENT'],'MSIE'))
$url = "https://server2.com/red.php?htuname=".urlencode('benutzer')."&htpasswd=".urlencode('kennwort')."&url=".urlencode('/url/auf/server2')."&additionalparameter=".urlencode($param);
else
$url = "https://".urlencode('benutzer').":".urlencode('kennwort')."@server2.com/url/auf/server2?additionalparameter=".urlencode($param);
echo "<a href=\"$url\">Link</a>";
Auf "Server 2" muss man nurnoch eine red.php zur Verfügung stellen:
<?php
//Weiterleitung mit HTTP-Authentification via JavaScript
//Benutzernamen und Kennwort extrahieren
$url = $_GET['url'];
$htuname = $_GET['htuname'];
$htpasswd = $_GET['htpasswd'];
unset($_GET['url']);
unset($_GET['htuname']);
unset($_GET['htpasswd']);
?>
<!DOCTYPE HTML>
<html xmlns="http://www.w3.org/1999/xhtml" lang="de">
<head>
<title>Weiterleitung</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<span>Bitte einen Augenblick Geduld: nach dem autmatisierten Login erfolgt die Weiterleitung. JavaScript muss im Browser aktiviert sein.</span>
<script type="text/javascript">
var url = "<?php echo $url ?>";
var htuname = "<?php echo $htuname ?>";
var htpasswd = "<?php echo $htpasswd ?>";
var data = <?php echo json_encode($_GET) ?>;
http = null;
if (window.XMLHttpRequest) {
//Alle Browser außer IE5 und IE6
http = new XMLHttpRequest();
} else {
//IE5 und IE6
http = new ActiveXObject("Microsoft.XMLHTTP");
}
//Parameter in String schreiben
var first = true;
for (name in data) {
if (first) {
first = false;
url += "?";
} else {
url += "&";
}
url += encodeURIComponent(name) + "=" + encodeURIComponent(data[name]);
}
http.open("get", url, false, htuname, htpasswd);
http.send();
if (http.status == 200) {
document.location = url;
} else {
alert("Benutzername und/oder Kennwort falsch.");
}
</script>
</body>
</html>
Wichtig ist wegen der SOP, dass diese Datei auf "Server 2" liegt.
Außerdem sollte der Link unbedingt HTTPS sein, da Benutzername und Kennwort sonst unverschlüsselt übertragen werden!
Falls jemand eine elegantere Lösung hat, kann er/sie die gerne noch posten.
Getestet in IE 8 und 9.