Wunnie: Eine .htaccess für Test und Produktion

Hallo,
mein lokales Apache-System verlangt in .htaccess

AddType application/x-httpd-php .html

und im Internet

AddType x-mapp-php4 .html

Ich muss daher immer aufpassen, dass ich nicht die lokale Version in den Internet-Server kopiere.
Gibt es eine Möglichkeit, den Server abzufragen und abhängig davon ob 127.... die entsprechene Zeile zu generieren?

  1. Hallo,

    mein lokales Apache-System verlangt in .htaccess

    AddType application/x-httpd-php .html

    und im Internet

    AddType x-mapp-php4 .html

    Ich muss daher immer aufpassen, dass ich nicht die lokale Version in den Internet-Server kopiere.
    Gibt es eine Möglichkeit, den Server abzufragen und abhängig davon ob 127.... die entsprechene Zeile zu generieren?

    Zu Frage müsste ich nachschauen...
    Indes: Du könntest auf dem Testserver (lokal) einen Script-Alias verwenden, z.B.:
        <Location /php-boots/>
            SetHandler application/x-httpd-php
        </Location>

    müsstest aber dann Dein Deployment für die Scripts anpassen, die lokal dann woanders liegen.

    Hotti

    --
    Neuer Begriff: Taggern
    Setzt sich zusammen aus 'Tackern' und 'Tag'. Beispiel: Einen anderen Titel an die Seite taggern.
  2. Gibt es eine Möglichkeit, den Server abzufragen und abhängig davon ob 127.... die entsprechene Zeile zu generieren?

    Mal ganz abgesehen davon, dass ich nicht ganz verstehe, warum Du Dateien, die php enthalten die Endung .html verpassen willst:

    Vergleiche doch mal welche Module geladen sind.

    Dann kannst Du IfModule ge- oder missbrauchen. Hilfreich, diese herauszufinden ist <?php phpinfo(); ?>, schaue da nach der Tabelle unter apache2handler, in der Zeile Loaded Modules nach.

    Du kannst aber auch mal nachschauen, was für Variablen gesetzt sind und dann mit

    <IfDefine WasAuchImmer>

    loslegen.

    Jörg Reinholz

    1. Gibt es eine Möglichkeit, den Server abzufragen und abhängig davon ob 127.... die entsprechene Zeile zu generieren?

      Mal ganz abgesehen davon, dass ich nicht ganz verstehe, warum Du Dateien, die php enthalten die Endung .html verpassen willst:

      Wurde so velangt.

      Deine Vorschläge würden gelten für ein lokales und ein Internet-System.
      Nun habe ich leider mehrere Domains bei unterschiedlichen Providern, so dass dort wiederum Unterschiede in den geladenen Modulen und anderen vorhanden sind.
      Es müsste deshalb wohl eine Abfrage auf Server 127..... sein.

  3. Tach!

    Gibt es eine Möglichkeit, den Server abzufragen und abhängig davon ob 127.... die entsprechene Zeile zu generieren?

    Alle Direktiven, die mit Bedingungen zu tun haben, fangen mit <If an. <If> kannst du vergessen, das ist noch zu neu - na gut, zusammen mit <IfVersion> geht das vielleicht. Aber wenn du schon 2.4 laufen hast und "im Internet" 2.2 oder gar noch einen 1.x hast, wäre das weniger klug, weil die Versionsunterschiede bei Nachvollziehen Probleme verursachen können. <IfVersion> - also ein Versionsvergleich - wird allein vielleicht nicht funktionieren, besonders nicht bei Gleichstand. <IfModule> ist auch nicht besser. Die beste individuell nutzbare Direktive ist noch <IfDefine>.

    dedlfix.

    1. Hi,

      Die beste individuell nutzbare Direktive ist noch <IfDefine>.

      ... aber auch da müsste ich ja wissen, was lokal bzw, auf den einzelnen Remote-Servern definiert ist.
      Das einzige aber was ich definitiv weiß ist, dass nur lokal die IP 127.0.0.1 ist.
      Es würde mich wundern, wenn man dies nicht auch abfragen könnte?

      1. Hallo,

        Das einzige aber was ich definitiv weiß ist, dass nur lokal die IP 127.0.0.1 ist.

        ja, das gilt aber für den Server deines Hosters ebenso - der hat lokal auch 127.0.0.1 (d.h. er sieht "sich selbst" als 127.0.0.1), weil das eine allgemeine Festlegung ist.

        Es würde mich wundern, wenn man dies nicht auch abfragen könnte?

        Und wenn, würde es dir nichts nützen.
        Ich verstehe aber nicht, warum du es als problematisch betrachtest, einfach auf beiden Systemen (lokal und online) je eine .htaccess mit den jeweils passenden Einträgen anzulegen, und die dann unverändert zu lassen.

        Ciao,
         Martin

        --
        Hannes würfelt abends immer, ob er den Abend mit seiner Frau zuhause verbringt oder in die Kneipe geht. Wenn er eine 6 würfelt, geht er in die Kneipe.
        Gestern musste er 37mal würfeln.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Ich verstehe aber nicht, warum du es als problematisch betrachtest, einfach auf beiden Systemen (lokal und online) je eine .htaccess mit den jeweils passenden Einträgen anzulegen, und die dann unverändert zu lassen.

          Das kan ich schon nachvollziehen. Der Wunnie hat Angst, dass er diese Monate oder Jahre später versehentlich mit transferiert, wenn er mal ein Update macht. Den Murks, der von anderen an anderer Stelle (hier die nicht sinntragende Anweisung) fabriziert wird zu reaparieren ohne den Murks selbst zu reparieren ist eben manchmal sehr schwierig.

          Ganz andere Vorschläge für Wunnie:

          Kopiere die '.htaccess' NUR AUF DEM SERVER nach '.htacces.PRODUKTION' - Dann hast Du dort ein Backup und kannst es wieder herstellen.

          Zweiter Vorschlag:

          Kopiere die '.htaccess' NUR AUF DEM TESTSYSTEM nach '.htacces.TESTSYSTEM' und lege in der Konfiguration des virtuellen Hosts oder des Hauptservers dieses als AccessFile an, also etwa so:

          <virtualhost>
              ServerName www.example.local
              DirectoryRoot /var/www/test/
              AccessFileName .htacces.TESTSYSTEM
          </virtualhost>

          Bei beiden Vorschlägen: Schreibe in die .htacces.PRODUKTION und /oder .htacces.TESTSYSTEM, einen Kommentar wozu die gut sind. Was auch gilt: Du musst ggf. die Alternativen mit pflegen.

          Jörg Reinholz

          1. Hallo Jörg!

            Dein zweiter Vorschlag gefällt mir gut.
            Selbst wenn ich versehentlich alle Dateien vom Test in Produktion übernehme, kann nichts passieren.
            Danke

      2. Tach!

        Die beste individuell nutzbare Direktive ist noch <IfDefine>.
        ... aber auch da müsste ich ja wissen, was lokal bzw, auf den einzelnen Remote-Servern definiert ist.

        Du hast die Macht über deinen lokalen Server. Dem kannst du ein -D verpassen und kannst ihn darüber wiedererkennen.

        <IfDefine meinD>
          lokales zeug
        </IfDefine>

        Damit kannst du schon mal zusätzliche Direktiven notieren. Die anderen Server haben zumindest dein -D nicht

        <IfDefine !meinD>
          remote-zeug
        </IfDefine>

        Zumindest für einen lokalen Server und ein oder mehrere gleiche "im Internet" reicht diese Variante. Für andere Konstellationen wirds schwerer. (Man kann die Direktiven auch schachteln.)

        Das einzige aber was ich definitiv weiß ist, dass nur lokal die IP 127.0.0.1 ist.

        Nee, jeder ist 127.0.0.1

        dedlfix.

        1. Hi,

          Nee, jeder ist 127.0.0.1

          Ich habe offensichtlich ein Blackout.
          In meinen PHP-Programmen sind häufig Abfragen der Art
          if (substr($_SERVER['SERVER_ADDR'], 0, 7) == '127.0.0')
          und damit habe ich bisher immer den lokalen Rechner identifiziert.

          1. Hallo,

            Nee, jeder ist 127.0.0.1
            Ich habe offensichtlich ein Blackout.

            kann schon sein. ;-)

            In meinen PHP-Programmen sind häufig Abfragen der Art
            if (substr($_SERVER['SERVER_ADDR'], 0, 7) == '127.0.0')
            und damit habe ich bisher immer den lokalen Rechner identifiziert.

            Ja, aber aus der Sicht von PHP ist ja auch der Server der "lokale Rechner" - jede Büchse sieht sich selbst als 127.0.0.1, wie ich heute vormittag schon erklärte.

            Du könntest allenfalls mit $_SERVER['REMOTE_ADD'] abfragen, ob der anfragende Client ebenfalls 127.0.0.1 hat, was dann bedeuten würde, dass Server (Apache+PHP) und Client (Browser) auf derselben Maschine laufen.

            Ciao,
             Martin

            --
            Du kannst dem Leben nicht mehr Tage geben.
            Aber dem Tag mehr Leben.
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
            1. Hallo,

              Ja, aber aus der Sicht von PHP ist ja auch der Server der "lokale Rechner" - jede Büchse sieht sich selbst als 127.0.0.1, wie ich heute vormittag schon erklärte.

              Wenn ich

              <?php  
               $ip = $_SERVER['SERVER_ADDR'];  
               echo "*$ip*";  
               ?>
              

              auf meinem lokalen Rechner laufen lasse, so ist das Ergebnis *127.0.0.1*
              im Internet aber *94.102.2....*, aus Sicht von PHP also nicht der lokale Rechner.

              1. auf meinem lokalen Rechner laufen lasse, so ist das Ergebnis *127.0.0.1*
                im Internet aber *94.102.2....*, aus Sicht von PHP also nicht der lokale Rechner.

                Alles schön und gut, nützt Dir aber nichts.

                Wnn Du ifDefine verwenden willst, dann starte der Apache doch lokal mit

                apache2 -D isTestsystem

                Dann kannst Du mit

                <ifDefine isTestsystem>
                  ...
                </ifDefine>

                hantieren.

                Aus der Hilfe:

                -D parameter
                   Sets a configuration parameter which can be used with <IfDefine> sections in
                   the configuration files to conditionally skip or process commands at server
                   startup and restart.

                Jörg Reinholz

                1. auf meinem lokalen Rechner laufen lasse, so ist das Ergebnis *127.0.0.1*
                  im Internet aber *94.102.2....*, aus Sicht von PHP also nicht der lokale Rechner.

                  Alles schön und gut, nützt Dir aber nichts.

                  Eine praktikable Löung habe ich ja gefunden, aber ich möchte es gerne kapieren.
                  Martin hat geschrieben:
                  ja, das gilt aber für den Server deines Hosters ebenso - der hat lokal auch 127.0.0.1 (d.h. er sieht "sich selbst" als 127.0.0.1), weil das eine allgemeine Festlegung ist.

                  Wenn mir PHP auf dem Server meines Hosters einen Wert ungleich 127.0.0.1 liefert, so müsste dieser Wert doch auch in meiner .htaccess auf diesem Server bekannt sein?

                  1. Tach!

                    ja, das gilt aber für den Server deines Hosters ebenso - der hat lokal auch 127.0.0.1 (d.h. er sieht "sich selbst" als 127.0.0.1), weil das eine allgemeine Festlegung ist.

                    Auf jedem Rechner, der TCP/IP sprechen kann, zeigt 127.0.0.1 immer auf ihn selbst.

                    Wenn mir PHP auf dem Server meines Hosters einen Wert ungleich 127.0.0.1 liefert, so müsste dieser Wert doch auch in meiner .htaccess auf diesem Server bekannt sein?

                    Dass du online eine andere Adresse siehst, liegt daran, dass der dortige Server so konfiguriert ist, dass er Anfragen (zumindest die für deine Anwendung) über diese offizielle Adresse entgegennimmt und dir dann diese präsentiert statt seiner ebenso vorhandenen 127.0.0.1. Dein Apache zu Hause wird vermutlich nur auf 127.0.0.1 reagieren. Das heißt, ihm wird wohl keine andere Adresse konfiguriert sein.

                    Diese Unterscheidung nützt dir nur für die .htaccess nichts, weil du da keine unterschiedlichen Konfigurationen unterschieden anhand der IP in einer einzigen .htaccess verwenden kannst (zumindest nicht vor Version 2.4).

                    dedlfix.

                  2. Wenn mir PHP auf dem Server meines Hosters einen Wert ungleich 127.0.0.1 liefert, so müsste dieser Wert doch auch in meiner .htaccess auf diesem Server bekannt sein?

                    Jein. mod_rewrite kann das in einer Kondition unterscheiden. Ansonsten braucht es, wie dedlfix ausführt einen Apache ab Version 2.4.

                    Problemtisch daran ist, das ein früherer Apache auf die für ihn dann nicht erkennbare, also falsche Konfiguration reagiert in der er das mit der htaccess versehene Verzeichnis "zumacht"! (Error 500)

                    Hättest Du überall einen Apache ab 2.4 könntest Du also

                    <If "%{HTTP_HOST}" = 'localhost' || "%{HTTP_HOST}" = '127.0.0.1'>
                        #... was auch immer
                    </If>

                    einsetzen. Geht aber nicht, weil der ist zu neu, noch nicht mal in Linux-Distributionen enthalten, die "gegenüber aktuellen Versionen sehr aufgeschlossen sind" und bei Deinem (früher mal eine ganz gute Wahl gewesenen Hoster - wohl 1und1) ganz gewiss nicht im Einsatz.

                    Jörg Reinholz

                    1. Tach!

                      Hättest Du überall einen Apache ab 2.4 könntest Du also
                      <If "%{HTTP_HOST}" = 'localhost' || "%{HTTP_HOST}" = '127.0.0.1'>
                          #... was auch immer
                      </If>

                      Nun, man könnte das in einem <IfVersion> kapseln.

                      einsetzen. Geht aber nicht, weil der ist zu neu, noch nicht mal in Linux-Distributionen enthalten, die "gegenüber aktuellen Versionen sehr aufgeschlossen sind"

                      Ist in Fedora 18 (Release: 15. Januar) drin.

                      und bei Deinem (früher mal eine ganz gute Wahl gewesenen Hoster - wohl 1und1) ganz gewiss nicht im Einsatz.

                      Das garantiert noch nicht.

                      dedlfix.

  4. Tach,

    mein lokales Apache-System verlangt in .htaccess

    AddType application/x-httpd-php .html

    und im Internet

    AddType x-mapp-php4 .html

    Ich muss daher immer aufpassen, dass ich nicht die lokale Version in den Internet-Server kopiere.

    ich würde auf dem lokalen System die AccessFileName-Direktive ändern und die Einstellungen lokal über Directory setzen; die Menge an Konfigurationsfehlern, die man machen kann, weil Dinge in Directory erlaubt sind, aber nicht in .htaccess ist ziemlich übersichtlich und sind eh keine Dinge, die man in einer Shared Hosting Umgebung ändern könnte.

    mfg
    Woodfighter