Hi Jeff,

after another evening, this is what i came up with:

Goals:
1. I do not want to mess around with /etc/apache2/conf.d/mod_fcgid.conf
2. I do not want to be forced to always use mod_fcgid on virtual hosts that are 
configured for mod_cgi (from Plesk)

I achieve this by doing all necessary changes in 
/srv/www/vhosts/<domain.tld>/conf/vhost.conf (in case of a subdomain ist could 
also be /srv/www/vhosts/domain.tld/subdomains/<subdomain>/conf/vhost.conf) and 
amending the respective httpd.include file (in 
/srv/www/vhosts/<domain.tld>/conf as well).

The downside is, that this httpd.include file gets generated by Plesk whenever 
you change anything for that virtual host or a subdomain for that virtual host. 
There is an event manager in Plesk where you can specify to run a specific 
script after an event has taken place like 'hosting domain create/update' to 
reverse any changes to httpd.include but it would require more work and 
knowledge to write such a script, i.e. cutting the respective <IfModule 
mod_fcgid.c> container (see below) and adding necessary code either in 
httpd.include or a vhost.conf file. Certainly it is doable, though.

Fine.

[btw, maybe it was my fault but using your replacement code 1:1 causes every 
file (tested with php or jpeg) to be offered for download by the browser 
(tested on 2 different computers with FF 3.5.3, IE 6 and IE 8)]

To get mod_fcgid running with this watermark script and not to interfere with 
virtual hosts configured to use mod_cgi, i did amend/extend a couple of things, 
plus, i did add FCGIWrapper statement back in which might be useless but i 
wanted to know whether that directive is part of the problem. Actually it is 
not. The problem starts when using 'SetHandler fcgid-sript' instead of an 
Alias/Action combination.

/etc/apache2/conf.d/mod_fcgid.conf is back to 'out-of-the-box' configuration. I 
only added

PassHeader Authorization
PHP_Fix_Pathinfo_Enable 1

like before.


My httpd.include is:

<VirtualHost <IP>:80>
...
        <Directory  /srv/www/vhosts/domain.tld/httpdocs>
        <IfModule mod_perl.c>
        <Files ~ (\.pl$)>
                SetHandler perl-script
                PerlHandler ModPerl::Registry
                Options ExecCGI
                allow from all
                PerlSendHeader On
        </Files>
        </IfModule>
        <IfModule mod_python.c>
        <Files ~ (\.py$)>
                SetHandler python-program
                PythonHandler   mod_python.cgihandler
        </Files>
        </IfModule>
        <IfModule mod_fcgid.c>
                <Files ~ (\.fcgi)>
                        SetHandler fcgid-script
                        Options +FollowSymLinks +ExecCGI
                </Files>
        </IfModule>
#       <IfModule mod_fcgid.c>
#       <Files ~ (\.php)>
#               SetHandler fcgid-script
#               FCGIWrapper /usr/bin/php-cgi5 .php
#               Options +ExecCGI
#               allow from all
#       </Files>
#       </IfModule>
                Options -Includes -ExecCGI
        </Directory>
        Include /srv/www/vhosts/domain.tld/conf/vhost.conf
</VirtualHost>

so you could skip/delete the second <IfModule mod_fcgid.c> container from 
httpd.include.

The included vhost.conf file then contains:
---
Alias /phpfcgidpath/ "/usr/bin/"
Action php-fcgid /phpfcgidpath/php-cgi5
  <Location /phpfcgidpath/>
    SetHandler fcgid-script
    Options +ExecCGI
  </Location>
  <Files ~ (\.php)>
          SetHandler php-fcgid
          FCGIWrapper /usr/bin/php-cgi5 .php
          Options +ExecCGI
          allow from all
  </Files>
---

The first two statements are basically similiar to the 
/etc/apache2/conf.d/php_cgi.conf (and needed as i did replace /phppath/ with 
/phpfcgidpath/ for which there is no ScriptAlias and Action statement in any 
other *.conf file):
---
scriptAlias /phppath/ "/usr/bin/"
Action php-script /phppath/php-cgi5
---

As i wanted to have a testconfig which does not interfere with mod_cgi, i 
changed from /phppath/ to /phpfcgidpath/ and did use Alias instead of 
ScriptAlias because you used it in your replacement bit. In the end it does not 
really matter.

This causes only virtual hosts which have this additional statement in its 
vhost.conf to use mod_fcgid and the watermark image works with this 
configuration.

As soon as you change the SetHandler statement in the vhost.conf from:

  <Files ~ (\.php)>
          SetHandler php-fcgid
          FCGIWrapper /usr/bin/php-cgi5 .php
          Options +ExecCGI
          allow from all
  </Files>

to 

  <Files ~ (\.php)>
          SetHandler fcgid-script
          FCGIWrapper /usr/bin/php-cgi5 .php
          Options +ExecCGI
          allow from all
  </Files>

(which is the default from Plesk in httpd.include when switching to 
FastCGI-Application), PHP tries to parse the jpg file again. This is expected 
as changing the SetHandler directive as shown, the Alias and Action directive 
are not used anymore as we do not use the Handler php-fcgid anymore and we are 
back to square one.


Using this 'workaround' does have one other side-effect:

As we are using a Alias (or ScriptAlias) directive, now, when we call an URL 
from a .htaccess protected directory -AuthType Basic in connection with 
PassHeader Authrization-, the _SERVER["REMOTE_USER"] variable is empty and 
_ENV["REDIRECT_REMOTE_USER"] is used instead. This is not really a problem, but 
when you try to use PHP Auth, you have to adopt your scripts not only to test 
for REMOTE_USER but also for REDIRECT_REMOTE_USER like

<?php
if (!isset($_SERVER["REMOTE_USER"]) && 
!isset($_SERVER["REDIRECT_REMOTE_USER"])) {
    echo "Not authenticated";
    } else {
    <do something else>
}
?>

As i am curious, i would like to know what the difference in the mod_fcgid 
source code is to cause such a different behaviour. Obviously you can get it to 
work by the use of the Alias / Action combination with the SetHandler directive 
but when using it as shown in the docs (and implemented by Plesk and a couple 
of other GUI's i would guess) then this watermark script (and variations of 
them) fail(s).

HTH,
Marcus

Reply via email to