Umleitung auf einen anderen DNS-Namen und erzwingen von HTTPS innerhalb eines VirtualHosts

Wenn man eine Webseite mit mehreren DNS-Namen betreibt, möchte man meistens nur ein SSL-Zertifikat für diese erwerben. Eine solche Webseite wird bei einem Apache Webserver zudem meistens innerhalb eines VirtualHost konfiguriert. Daraus ergibt sich somit die Anforderung, innerhalb eines VirtualHost bei einem Apache Webserver gleich zwei Weiterleitungen zu konfigurieren.

  1. Eine Weiterleitung von http://<hostname1>.<domain>.de auf http://<hostname2>.<domain>.de
  2. Eine Weiterleitung von  http://<hostname2>.<domain>.de auf https://<hostname2>.<domain>.de

Damit der Browser keine Warnmeldung ausgibt, muss dass Zertifikat für den richtigen DNS-Namen ausgestellt sein. Deshalb ist es sehr wichtig, dass die Weiterleitungen nicht gleichzeitig sondern nacheinander ausgeführt werden. Beim ersten Aufruf der Seite muss nur auf den zweiten DNS-Namen umgeleitet werden. Beim zweiten Aufruf der Seite (der dann ja schon über den zweiten DNS-Namen erfolgt) muss dann von HTTP auf HTTPS umgeleitet werden.

Die serverseitige Umleitung von einer URL auf die andere Erfolg bei Apache üblicherweise über das Modul mod_rewrite. Bevor man dieses verwendet, muss es aktiviert werden. Dies geschieht bei Debien oder Ubuntu mit den folgendem Befehl.

a2enmod rewrite

Danach muss der Apache neu gestartet werden, damit das Modul geladen wird. Dies erledigt man bei einem neueren Ubuntu z.B. mit dem folgenden Befehl.

service apache2 restart

Die Regel für eine Weiterleitung besitzt bei Apache sogenannte Flags. Diese legen die genaue Funktionsweise der Weiterleitung fest. Um eine Weiterleitung durch Ersetzen zu erreichen wird das Flag R benötigt. Das Flag R steht für Replace und bedeutet, dass Teile der URL durch etwas anderes ersetzt werden. Wenn die Weiterleitung zudem dauerhaft sein soll, ist bei dem Flag R zudem ein Grund 301 hilfreich. Dieser Grund signalisiert, dass die Weiterleitung dauerhaft sein soll. Das Flag wird dann als „R=301“ geschrieben.

Obwohl die Konfiguration für beide Weiterleitungen in der Konfiguration von demselben VirtualHost steht, darf nur eine zur Zeit ausgeführt werden. Dies wird durch das Flag L erreicht. Dieses Flag steht für Last und bedeutet, dass beim Greifen der Rewrite-Regel keine weitere Rewrite-Regel ausgeführt wird. Es wird also immer nur eine Regel pro Aufruf ausgeführt.

Zudem ist wichtig, dass als erstes die Regel für die Weiterleitung auf den ersten DNS-Namen kommt. Erst danach darf die Regel für die Weiterleitung auf HTTPS kommen.

Wenn man all diese Bedingungen beachtet, sollten Rewrite-Regeln wie folgt aussehen.

RewriteEngine on
RewriteCond %{HTTP_HOST}   ^hostname1\.domain\.de$ [NC]
RewriteRule   ^/(.*)$ http://hostname2.domain.de/$1  [R=301,L]
 
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Weitere Informationen zum mod_rewrite gibt es auf den entsprechenden Webseiten beim Apache-Projekt unter http://httpd.apache.org/docs/current/mod/mod_rewrite.html oder https://httpd.apache.org/docs/current/rewrite/flags.html zu finden.

Die wichtigsten URL Escapecodes

Da ich in der Vergangenheit immer wieder im Internet gesucht habe, schreibe ich mir hier mal die wichtigsten URL Escapecodes auf. Ich hoffe das hilft auch anderen weiter.

  • SPACE = %20
  • < = %3C
  • > =%3E
  • # = %23
  • % = %25
  • { = %7B
  • } = %7D
  • | = %7C
  • \ = %5C
  • ^ = %5E
  • ~ = %7E
  • [ = %5B
  • ] = %5D
  • ` = %60
  • ; = %3B
  • / = %2F
  • ? = %3F
  • : = %3A
  • @ANTISPAM@ = %40
  • = = %3D
  • & = %26
  • . = %2E
  • ! = %21

Magento: Zwischensummen und Versandkosten inkl. MWSt. anzeigen

Lustiger Weise gibt es bei Magento bis zur aktuellen Version 1.3.2.4 immer noch keine Einstellung, um die Zwischensumme und die die Versandkosten inklusive MWSt. anzuzeigen. Dies ist insbesondere bei einem deutschen B2C-Shop jedoch dringend erforderlich. Ansonsten geht man das Risiko ein von der Konkurrenz kostenpflichtig Abgemahnt zu werden.

Gott sei dank war Tschan so nett im Magento-Forum eine Anleitung zu posten. Diese besteht aus zwei Schritten:

1. Oben in die Datei /app/design/frontend/default/YourTheme/template/checkout/total/default.phtml das folgende einfügen.

getTotals();

if ($this->getTotal()->getCode() == 'subtotal') {
    $subtotal = $this->getTotal()->getValue();
    $subtotal += $totals['tax']->getValue()-$totalsObj->getQuote()->getShippingAddress()->getShippingTaxAmount();
    $this->getTotal()->setValue($subtotal);
    $this->getTotal()->setTitle(Mage::helper('sales')->__('Subtotal incl. Tax'));
}

if ($this->getTotal()->getCode() == 'shipping') {
    $shipping = $this->getTotal()->getValue();
    $shipping += $totalsObj->getQuote()->getShippingAddress()->getShippingTaxAmount();
    $this->getTotal()->setValue($shipping);
}

?>

2. In die beiden Dateien /app/design/frontend/default/YourTheme/template/sales/order/items.phtml und /app/design/frontend/default/YourTheme/template/email/order/items.phtml nach der Zeile getOrder() ?> das folgende einfügen.

getSubtotal() + $_order->getTaxAmount() - $_order->getShippingTaxAmount();
$_order->setSubtotal($subtotalInclTax);

$shippingInclTax = $_order->getShippingAmount() + $_order->getShippingTaxAmount();
$_order->setShippingAmount($shippingInclTax);

?>

Elm@r: Google-Produktdatei um den Zustand erweitern

Seit einigen Wochen verlangt Google-Base (Merchant Center), dass bei Produkten der Zustand (bzw. condition) angegeben wird. Dies führt dazu das die Übermittlung der Produkte von Elm@r für OS:Commerce an Google nicht mehr funktioniert. Mit zwei Änderungen in die Datei elmar_products.php kann man erreichen, dass bei dem Zustand immer neu übermittelt wird.

$froogle_spalten = array('product_url', 'name', 'description', 'price', 'condition', 'image_url', 'category', 'offer_id', 'instock', 'shipping', 'currency');
  case 'froogle':
    if (defined('FROOGLE_LANGUAGE_PARAM')) $productinfopage .= FROOGLE_LANGUAGE_PARAM;
       if ($free_shipping && $price >= MODULE_ORDER_TOTAL_SHIPPING_FREE_SHIPPING_OVER) {
         $versandkostenfroogle = 'DE:Versandkostenfrei:' . number_format(0, 2, '.', '');
        } else {
     if ($shipping_flat_status) {
           $versandkostenfroogle = 'DE:Versand pauschal:' . number_format($versandkosten, 2, '.', '');
        } else {
      $versandkostenfroogle = 'DE:Versand ab:' . number_format($versandkosten, 2, '.', '');
           }
      }
          $zeile = $productinfopage.$delimiter.
                field_to_csv($pn, 80).$delimiter.  // "Up to 80 characters will be displayed."
              field_to_csv($description, 65535).$delimiter.  // "Descriptions over 1000 characters may be truncated."
                    number_format($price, 2, '.', '').$delimiter.  // 1234.56i
                    'new'.$delimiter.
                  $prodimg.$delimiter.
                field_to_csv(str_replace('|', ' > ', $kategorie)).$delimiter.
              $pi.$delimiter.
                    ($product_info[LIEFERBARKEIT_FELDNAME] > 0 ? 'Y' : 'N').$delimiter.
               $versandkostenfroogle.$delimiter.
                     $currency;
         if (MANUFACTURERS_NAME)
         $zeile .= $delimiter.field_to_csv($manufacturer);
     $zeile .= $lineend;
    break;

Magento für einen deutschen Webshop einrichten

Um Magento für einen deutschen Webshop (B2C Markt) zu verwenden sollte man in jedem Fall zwei Anpassungen machen. Zum einen sollte man eine automatische Update-Funktion einbauen, um Sicherheitsupdates schnell einspielen zu können und zum anderen sollte man den eigentlich englischen Webshop an die deutsche Sprache und Rechtslage anpassen. Diese Anpassungen können am schnellsten über den Magento Connect-Manager installiert und konfiguriert werden. Diesen findet man im Magento Admin-Panel unter System->Magento Connect->Magento Connect Manager. Bei dem Start des Managers wird man erneut aufgefordert sich einzuloggen und es haben nur Benutzer mit Admin-Rechten Zugang.

Update und Verwaltung der einzelnen Module
Magento ist “out of the box” verwendbar, sieht aber im Connect-Manager noch etwas puritanisch aus. Dieser bringt z.B. keine direkte Updatefunktion mit und listet keinerlei Erweiterungen auf. Um diese Auflistung zu erreichen und Magento-Extensions zu verwalten empfiehlt es sich als erstes die Erweiterungen „Mage_Downloader“ und „Mage_All_Latest“ zu installieren. Durch die Installation dieser beiden Module werden die benötigten Pakete nochmals heruntergeladen und installiert. Dabei werden aber die einzelnen Versionen der Module festgehalten. Dadurch kann später geprüft werden, ob es neuere Versionen der verwendeten Module gibt. Gegebenen Falls können diese dann installiert werden. Nähere Informationen zu der Installation der beiden Module findet man in dem exzellenten Blog mxperts.de (von Johannes Teitge und Daniel Sasse).

Anpassung an die deutsche Sprache und das deutsche Recht
Insbesondere die Anpassungen an alle Belange des deutschen Rechts sind sehr umfangreich und man läuft Gefahr sich eine kostenpflichtige Abmahnung einzuhandeln, wenn man diese unterlässt. Deshalb gibt es inzwischen einige Module, die man dafür verwenden kann. Ich würde gerade Neulingen bei Magento deshalb empfehlen das Modul „market_ready_germany“ zu installieren. Es versucht alle benötigten Module (im Augenblick sind es 14) in einem Abwasch zu installieren. Man sollte das Modul aber nur bei neu installierten Shops verwenden, da es zu Problemen kommt, wenn es beispielsweise schon eine Seite „agb“ oder „Impressum“ gibt.

Und dann die restlichen Anpassungen …
Nach den eben beschriebenen Installationen und Einstellungen hat man eine Gute Grundlage für einen deutschen Webshop und kann mit seinen individuellen Einstellungen und Erweiterung fortfahren. Hierfür kann man noch mal einen Blick auf eine Liste von weiteren interessanten Modulen werfen, die man wiederum bei mxperts.de findet. Es ist auch empfehlenswert die internen Caches zu deaktivieren, solange man den Shop an die eigenen Bedürfnissen anpasst. Dann werden die Änderungen immer gleich im Shop Frontend sichtbar. Man findet die entsprechenden Einstellungen im Magento Admin-Panel unter System->Cache Verwaltung->Cache Kontrolle->Alle Caches->Deaktivieren.

Update:
Magento zeigt im Augenblick leider immer noch die Zwischensumme und den Versand im Warenkorb und den Bestellungen ohne MWSt. an. Man muss Magento deshalb wie in diesem Post beschrieben etwas umprogrammieren.

Viel Spaß mit Magento!

Erste Erfahrungen mit Contenido 4.8

Rund ein halbes Jahr nach dem ersten Contenido in der Version 4.8 ist am 12.12.2008 die Version 4.8.9 erschienen. Diese Version macht inzwischen einen sehr stabilen und ausgereiften Eindruck und ist in vielen Punkten schneller und übersichtlicher als die alten 4.6.x-Versionen. Ich habe jetzt alle Contenido-Webseiten die ich betreue auf die neue Version umgestellt und hatte damit keine größeren Schwierigkeiten.

contenido 4.8

Besonders gut gefällt mir die bessere und leichtere Integration des Apache mod_rewrite für statische, googlefreundliche URLs. Bei den älteren 4.6.x-Versionen musste man dafür immer noch viel von Hand im Code umprogrammieren. Für die neueren 4.8.x-Versionen gibt es jetzt ein Advanced Mod Rewrite Plugin, dass man nur installieren und konfigurieren muss.

DIVs mit CSS horizontal und vertikal zentrieren

Es ist ein wenig knifflig mit CSS ein DIV auf einer Webseite zu zentrieren, da der IE (zumindest bis zur Version 7) kein margin:auto versteht.

Am besten legt man einen Div-Container an (in meinem Fall hat er die Ausmaße 790px * 480px), in dem man alle anderen Elemente reinpackt. Die eine Ecke dieses Containers kann man dann mit top: 50%; und left: 50%; genau in der Mitte positionieren. Danach verschiebt man mit margin: -240px 0 0 -395px; den Container so, dass die Mitte des Containers in der der Mitte ist. Das ganze sollte dann ungefähr so aussehen.


#Container {
  position: absolute;
  height: 480px;
  width: 790px;
  margin: -240px 0 0 -395px;
  top: 50%;
  left: 50%;
  text-align: left;
  padding: 0px;
}