Gast 1: Fehler in.htaccess

Hallo, die Folge

<if "%{DOCUMENT_ROOT}=~ /usr/">
AddType application/x-httpd-php53 .shtml
FcgidWrapper "/home/httpd/cgi-bin/php53-fcgi-starter.fcgi" .shtml
<FilesMatch "\.shtml$">
SetHandler fcgid-script
</FilesMatch>
</if>

in .htaccess führt zu einem Abbruch, ohne das

<FilesMatch "\.shtml$">
SetHandler fcgid-script
</FilesMatch>

erfolgt kein Abbruch. Wie muss ich letzteres angeben, damit es akzeptiert wird?

  1. Kannst mal bitte übersetzen was das werden soll? MfG

    PS:

    <FilesMatch "\.shtml$">
    SetHandler fcgid-script
    </FilesMatch>
    

    Macht überhaupt keinen Sinn!

    1. Macht überhaupt keinen Sinn!

      Anscheinend doch. Die Folge wurde von einem Provider mitgeteilt, damit shtml.Dateien mit php geparst werden. Und die Folge funktioniert auch so. Bei anderen sind andere Statements nötig. Nun soll aber nicht für jedes Projekt (bei unterschiedlichen Providern) ein anderes .htaccess verwendet werden, daher die If-Abfrage (DOCUMENT_ROOT ist bei allen Installationen unterschiedlich).

      1. Na dann guck mal ob das Modul für den Handler fcgid überhaupt geladen ist. Und Options +ExecCGI wäre auch zu prüfen.

        (DOCUMENT_ROOT ist bei allen Installationen unterschiedlich).

        Das mag schon sein. Aber eine .htaccess Date liegt gewöhnlich genau da. MfG

        PS: Ich würds anders machen: Den Handler zusammen mit dem Apache starten wie das bei FastCGI so üblich ist. Also direkt im Server konfigurieren. Und per .htaccess eine RewriteRule für .shtml setzen. So bist Du flexibel falls sich die Dateierweiterung mal ändern sollte oder andere hinzukommen.

      2. Tach!

        Nun soll aber nicht für jedes Projekt (bei unterschiedlichen Providern) ein anderes .htaccess verwendet werden, daher die If-Abfrage (DOCUMENT_ROOT ist bei allen Installationen unterschiedlich).

        Bist du sicher, dass du die unterschiedlichen Umgebungen durch das DocumentRoot-Verzeichnis unterscheiden kannst? Wäre nicht der Servername ein eindeutigeres Unterscheidungsmerkmal, oder laufen Test- und Produktivumgebungen mit demselben Namen?

        dedlfix.

        1. oder laufen Test- und Produktivumgebungen mit demselben Namen?

          Das ist (leider) ziemlich häufig der Fall. Nämlich immer dann, wenn nicht relative Links (oder solche mit dem Servername) verwendet werden. z.B. bei Benutzung mangelhaftem Gescribbel Dritter.

          1. Tach!

            oder laufen Test- und Produktivumgebungen mit demselben Namen?

            Das ist (leider) ziemlich häufig der Fall.

            Wie häufig das anderenorts so gemacht wird, nützt mir beim Finden von Lösungsvorschlägen für den vorliegenden Fall recht wenig. Interessanter wäre die Frage, welche Kriterien man noch außer dem Server-/Hostnamen für die eindeutige Unterscheidung heranziehen kann.

            dedlfix.

            1. Interessanter wäre die Frage, welche Kriterien man noch außer dem Server-/Hostnamen für die eindeutige Unterscheidung heranziehen kann.

              $_SERVER['SERVER_ADDR'] wäre ein möglicher Weg (auf IP des Testservers prüfen). Aber selbst die lässt sich für ein Testsystem "faken" und ist womöglich nicht eindeutig (localhost?, tragbares Gerät mit wechselnden IPs, schlecht konfigurierter DHCP, ...) - was die Sache schwierig machen kann.

              Im schlimmsten denkbaren Fall schreibt man sich was in die Umgebung: mod_env->SetEnv

            2. Interessanter wäre die Frage, welche Kriterien man noch außer dem Server-/Hostnamen für die eindeutige Unterscheidung heranziehen kann.

              Sowas ist hoffentlich eindeutig genug:

              $TestSystemFestplattenUUID = '512337f6-88f3-45db-9151-2db2c4e75a58';
              if ( "1" == `lsblk -o UUID | grep $TestSystemFestplattenUUID | wc -l` ) {
                 echo "Testsystem.";
              } else {
                 echo "Irgend was anderes.";
              }
              

              Die UUID des Dateisystems kann man in einer Konsole mit lsblk -o NAME,UUID herausfinden. Vermutlich wird man die von /dev/sda wollen, man kann aber auch die von einen USB-Stick nehmen...

              Allerdings ist die vorgestellte Methode "eher ein Scherz".

              1. Tach!

                Sowas ist hoffentlich eindeutig genug:

                Klappt nur leider nicht für die .htaccess / Apache-Konfiguration.

                Allerdings ist die vorgestellte Methode "eher ein Scherz".

                Durchaus.

                dedlfix.

                1. Also bleibt es bei

                  SetEnv Testserver 1
                  

                  in der Server-Konfiguration (/etc/apache/..). (Nicht: .htaccess). Denn die Server-Konfiguration kopiert man nicht einfach wie die .htaccess auf das Testsystem.

                  Auf <IfModule> … </IfModule> würde ich hier absichtlich verzichten, damit ich einen Start-Fehler bekomme, statt dass es nur einfach nicht funktioniert wenn mod_env auf dem Testserver nicht geladen werden sollte.

  2. Tach!

    Wie muss ich letzteres angeben, damit es akzeptiert wird?

    Erstmal die Ursache ermitteln. Es gibt bei der Konfiguration nicht nur den einen richtigen Weg. Was genau konfiguriert werden muss, hängt davon ab, was im betreffenden System konfiguriert ist, und auch welche konkreten Bezeichner für die Dinge verwendet wurden. Der Administrator oder die Dokumentation des Hosters sollten eigentlich beschreiben können, was wie zum Erfolg führt. Wenn nicht, muss man selbst forschen. Der Start dazu sind die Logfiles, besonders das Error-Log. Leider steht das nicht bei jedem Hoster zur Einsicht zur Verfügung. Aber versuch erstmal dieses ausfindig zu machen. Wo genau man das findet? Nun, das ist wieder eine Sache der individuellen Konfiguration.

    dedlfix.

  3. Hallo,
    nicht das Erkennen der Umgebung ist mein Problem. Die Umgebung wird durch das DOCUMENT_ROOT eindeutig erkannt. Das Problem ist warum

    <FilesMatch "\.shtml$">
    SetHandler fcgid-script
    </FilesMatch>
    

    innerhalb des IF nicht erlaubt ist. Außerhalb des IF-Statements läuft es korrekt. Es liegt doch daher vermutlich an den < und >, die vielleicht maskiert werden müssen.

    1. Tach!

      Das Problem ist warum

      <FilesMatch "\.shtml$">
      SetHandler fcgid-script
      </FilesMatch>
      

      innerhalb des IF nicht erlaubt ist.

      Sagt die Apache-Dokumentation das so? Hast du mal ins ErrorLog geschaut, was da konkret als Meldung steht?

      Außerhalb des IF-Statements läuft es korrekt. Es liegt doch daher vermutlich an den < und >, die vielleicht maskiert werden müssen.

      Wenn es daran läge und man es maskieren müsste, würde das die Dokumentation des Apachen beschreiben. Üblicherweise muss man das aber nicht tun. Das Ende des <If>-Bereiches kann eindeutig am </If> erkannt werden. Maskieren müsste man nur, wenn bereits das < als Ende erkannt werden würde. Dann würde man es aber auch nicht so ausführlich als </If> schreiben müssen. Fehlende Maskierung ist es also nicht.

      dedlfix.

    2. Es liegt doch daher vermutlich an den < und >, die vielleicht maskiert werden müssen.

      Hihi. Witzbold.

      "Wenn die Direktive innerhalb einer .htaccess-Datei oder in einem <Directory>- oder <Location>-Abschnitt angegeben wird, erzwingt sie, dass alle entsprechenden Dateien von dem durch Handlername angegebenen Handler analysiert werden."