Albler: Geht so etwas mit "Server side include"?

Guten Morgen!
Ist ein Include möglich in Abhängigkeit vom Vorhandensein einer bestimmten Datei, also in etwa
if test.txt exists
  then include datei1.inc
else include datei2.inc.
Da "if" in SSI existiert gehtes letztlich darum, ob ich die Anwesenheit einer Datei abfragen kann.
Gruß
Albler

  1. Da "if" in SSI existiert gehtes letztlich darum, ob ich die Anwesenheit einer Datei abfragen kann.

    http://wasd.vsm.com.au/doc/env/env_0400.html#07447665

    1. Hallo

      http://wasd.vsm.com.au/doc/env/env_0400.html#07447665

      Danke für den Link.
      Wenn ich es allerdings bei mir versuche mit

        
      <!--#fcreated virtual="/Dok/inhalt_vorhanden.shtml" fmt="?" -->  
      <!--#if var={THE_FILE_NAME} eqs="" -->  
      Fehler  
      <!--#else -->  
      Korrekt  
      <!--#endif -->  
      
      

      kommen die Fehlermeldungen
      [Wed Nov 03 11:07:19 2010] [error] [client 127.0.0.1] unknown directive "fcreated" in parsed doc D:/test/index.shtml
      [Wed Nov 03 11:07:19 2010] [error] [client 127.0.0.1] too many arguments for if element in D:/test/index.shtml

      1. Hallo,

        http://wasd.vsm.com.au/doc/env/env_0400.html#07447665

        <!--#fcreated virtual="/Dok/inhalt_vorhanden.shtml" fmt="?" -->
        <!--#if var={THE_FILE_NAME} eqs="" -->

        [...]

        kommen die Fehlermeldungen
        [Wed Nov 03 11:07:19 2010] [error] [client 127.0.0.1] unknown directive "fcreated" in parsed doc D:/test/index.shtml

        schon mal auf die Idee gekommen, die anderen genannten Direktiven auszuprobieren, wie z.B. #fsize?

        Freundliche Grüße

        Vinzenz

        1. Hallo,

          schon mal auf die Idee gekommen, die anderen genannten Direktiven auszuprobieren, wie z.B. #fsize?

          Nein, da ich noch zu wenig von SSI verstehe.
          Jetzt aber habe ich es versucht mit

            
          <!--#fsize file="Dok/inhalt.shtml" -->  
          <!--#if var={THE_FILE_NAME} eq=0 -->  
          Fehler  
          <!--#else -->  
          Korrekt  
          <!--#endif -->  
          
          

          kommt noch eine Fehlermeldung:
          too many arguments for if element in D:/test/index.shtml

          Freundliche Grüße
          Albler

          1. too many arguments for if element in D:/test/index.shtml

            Je nach SSI-Implementierung ist die Syntax abweichend.

            mod_include unter Apache hat z.B. eine leicht andere Syntax als das von mir verlinkte WASD SSI. Die SSI-Umsetzung im IIS weicht wieder etwas ab.

            Unter mod_include ist die Syntax für eine Verzweigung <!-- #if expr="bedingung" --> - und je nach Server-Konfiguration kann das sogar nochmals abweichen wenn z.B. jemand die Begrenzer von <!-- und --> auf <SSI> und </SII> ändert.

            1. Unter mod_include ist die Syntax für eine Verzweigung <!-- #if expr="bedingung" --> - und je nach Server-Konfiguration kann das sogar nochmals abweichen wenn z.B. jemand die Begrenzer von <!-- und --> auf <SSI> und </SII> ändert.

              Nachtrag: unter mod_include gibt es THE_FILE_NAME ebenfalls nicht, da kann man aber zum "-A"-Flag vor der Expression greifen.

              1. Hallo,

                Unter mod_include ist die Syntax für eine Verzweigung <!-- #if expr="bedingung" --> - und je nach Server-Konfiguration kann das sogar nochmals abweichen wenn z.B. jemand die Begrenzer von <!-- und --> auf <SSI> und </SII> ändert.

                Nachtrag: unter mod_include gibt es THE_FILE_NAME ebenfalls nicht, da kann man aber zum "-A"-Flag vor der Expression greifen.

                vielleicht könntet Ihr mich nochmals unterstützen.
                Ich habe jetzt (unter Apache) angegeben

                <!--#if expr="-A /Dok/inhalt.shtml" -->

                Da kommt aber der Fehler:

                invalid expression "-A /Dok/inhalt.shtml"

                In der zitierten Doku steht:
                This test only has an effect if SSIEnableAccess is on
                Wo find ich diesen Parameter (falls es überhaupt daran liegen sollte)?
                Gruß
                Albler

                1. Wo find ich diesen Parameter (falls es überhaupt daran liegen sollte)?

                  in einem .htaccess File oder irgendwo in der Serverkonfiguration (siehe Doku).

                  Je nach Betriebssystem liegt die Konfiguration an unterschielichen orten

                  /etc/httpd/conf/httpd.conf ist afaik der Vorgabepfad unter RHEL, /etc/apache/ oder /etc/apache2/ ist ebenfalls ein guter Ansatzpunkt - in den meisten fällen heisst es eben httpd.conf

                  Natürlich können einzelne virtual hosts auch eigene Konfigurationsfiles haben in denen das eingestellt wird - in der httpd.conf steht dann meistens irgendwo am ende folgendes

                  Include /etc/httpd/conf/vhosts/*.conf

                  1. Wo find ich diesen Parameter (falls es überhaupt daran liegen sollte)?

                    in einem .htaccess File oder irgendwo in der Serverkonfiguration (siehe Doku).

                    Lt. meiner Apache-Doku kann man es in .htaccess angeben,

                    Description: Enable the -A flag during conditional flow control processing.
                    Syntax: SSIEnableAccess on|off
                    Default: SSIEnableAccess off
                    Context: directory, .htaccess
                    Status: Base
                    Module: mod_include

                    aber Pustekuchen:
                    Jetzt kommt die Meldung:
                    Invalid command "SSIEnableAccess", perhaps misspelled or defined by a module not defined in the server configuration.

                    Der Modul mod_include muss aber vorhanden sein, denn das SSI-include funktioniert ja!

                  2. Hallo,
                    ich hoffe, das liest noch jemand!
                    Nachdem ich mit der SSI-Abfrage auf Dateiexistenz nicht weiterkam,
                    habe ich jetzt eine andere Lösung gesucht und (fast) gefunden.
                    Ich rufe über SSI ein Perl-Programm auf, das die Prüfung vornimmt.
                    Das Perl-Programm erzeugt auch korrekt eine Environment-Variable mit dem Ergebnis (0 oder 1), die aber ist in dem rufenden Programm nicht vorhanden.
                    Was ist dafür die Ursache?

                      
                    <html>  
                    <head>  
                    <title>Test</title>  
                    </head>  
                    <body>  
                    <!--#set var="PRUEF_DATEI" value="/Test/t1.shtml" -->  
                    <!--#exec cgi="/cgi-bin/fileexist.pl" -->  
                    <!--#echo var="PRUEFUNG" -->  
                    <!--#if expr="$PRUEFUNG=1" -->  
                    ok  
                    <!--#else -->  
                    ko  
                    <!--#endif -->  
                    </body>  
                    </html>  
                    
                    
                      
                    #!/usr/bin/perl -w  
                    use strict;  
                    use warnings;  
                    use CGI::Carp qw(fatalsToBrowser);  
                    my $datei=$ENV{'DOCUMENT_ROOT'}.$ENV{'PRUEF_DATEI'};  
                    if (-e $datei)  
                      {$ENV{PRUEFUNG} = 1}                                          # Datei vorhanden  
                    else  
                      {$ENV{PRUEFUNG} = 0}                                          # Datei nicht vorhanden  
                    exit 0;  
                      
                    
                    
                    1. ich hoffe, das liest noch jemand!

                      Sicher, ich habe auch deinen anderen Post gelesen - konnte dazu aber nichts mehr beitragen.

                      Ich rufe über SSI ein Perl-Programm auf, das die Prüfung vornimmt.

                      Warum machst du das include selbst nicht gleich mit Perl?

                      $file = '/foo.pl';
                      if (-e $file) {
                        require 'foo.pl'
                      }

                      1. Hallo,

                        Warum machst du das include selbst nicht gleich mit Perl?

                        $file = '/foo.pl';
                        if (-e $file) {
                          require 'foo.pl'
                        }

                        Ich will die Datei nicht einfügen, sondern, wenn sie da ist, ein link auf sie erzeugen, wenn nicht, dann einen einfachen Text anzeigen (z.B. Seite vorübergehend nicht erreichbar).
                        Gruß
                        Albler
                        Da das für verschiedene Fälle funktionieren soll, möchte ich auch nicht die betr. HTML-Textstücke im PL-Programm erzeugen.

                        Gruß
                        Albler

                        PS. War der Verweis auf diesen "alten" thread so OK oder ist dies schon eine Art "Doppelposting"?

                        1. Moin Moin!

                          PS. War der Verweis auf diesen "alten" thread so OK oder ist dies schon eine Art "Doppelposting"?

                          Quengelposting. Vollkommen nutzlos obendrein, weil es viel weiter unten auf der Seite steht als dieser Thread.

                          Alexander

                          --
                          Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
                          1. Vollkommen nutzlos obendrein, weil es viel weiter unten auf der Seite steht als dieser Thread.

                            Wie bitte? Es steht viel weiter oben!
                            Wie kann ich auf etwas verlinken, was noch gar nicht vorhanden ist!

                            1. Moin Moin!

                              Vollkommen nutzlos obendrein, weil es viel weiter unten auf der Seite steht als dieser Thread.

                              Wie bitte? Es steht viel weiter oben!

                              Unten in meiner benutzerspezifischen Ansicht, und nicht nur in meiner.

                              Alexander

                              --
                              Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
                    2. Moin Moin!

                      Das Perl-Programm erzeugt auch korrekt eine Environment-Variable mit dem Ergebnis (0 oder 1), die aber ist in dem rufenden Programm nicht vorhanden.
                      Was ist dafür die Ursache?

                      Jeder Prozess hat eine eigene, private Kopie des Environments. Wird ein Kindprozess erzeugt, bekommt dieser entweder ein komplett neues Environment oder eine Kopie des Environments des aufrufenden Prozesses.

                      Alexander

                      --
                      Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
                      1. Hi,

                        Jeder Prozess hat eine eigene, private Kopie des Environments. Wird ein Kindprozess erzeugt, bekommt dieser entweder ein komplett neues Environment oder eine Kopie des Environments des aufrufenden Prozesses.

                        Von der Prozessverwaltung habe ich leider keine Ahnung.
                        Ich nehme aber an, dass das rufende html/SSI ein Prozess ist und das Perl-Programm der Kind-Prozess.
                        Wie wenn nicht über die Environment-Variablen, kann der Kind-Prozess Infos an den rufenden Prozess mitgeben?
                        Gruß
                        Albler

                        1. Moin Moin!

                          Von der Prozessverwaltung habe ich leider keine Ahnung.

                          Dann fang an zu lernen.

                          Ich nehme aber an, dass das rufende html/SSI ein Prozess ist und das Perl-Programm der Kind-Prozess.

                          Typischerweise ja.

                          Wie wenn nicht über die Environment-Variablen, kann der Kind-Prozess Infos an den rufenden Prozess mitgeben?

                          STDOUT, STDERR, andere vereinbarte Filehandles, Pipes, FIFOs, Unix Domain Sockets, TCP/IP-Sockets, Signale, SysV IPC, Shared Memory, ...

                          Alexander

                          --
                          Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
                          1. Wie wenn nicht über die Environment-Variablen, kann der Kind-Prozess Infos an den rufenden Prozess mitgeben?

                            STDOUT, STDERR, andere vereinbarte Filehandles, Pipes, FIFOs, Unix Domain Sockets, TCP/IP-Sockets, Signale, SysV IPC, Shared Memory, ...

                            Schön,
                            jetzt weiß ich, wie schlau du bist!