Různé verze PHP v rámci adresářové struktury
Občas je potřeba v různých adresářích mít různé verze PHP. Například když máte domena.cz/blog (jako WordPress s PHP 8.x) a domena.cz/shop (třeba jako Prestashop s PHP 7.x). Toto chování lze docílit pomocí úpravy našich defaultních configů a s pomocí funkcionality subdomén. Subdoménová funkcionalita je dostupná od operačního systému Debian Bookworm a novější.
Příklad nastavení pro ukázkovou doménu vhtest.cz
V nastavení domény je potřeba nejprve založit subdomény.
Takto vypadá defaultní config subdomény v Apache. Je tam toho fakt hodně i se scrollbarem:
Následně je potřeba ho upravit takto jednoduše:
Textově takto. Musíte nahradit doménu a adresář za svou reálnou doménu a adresář. V našem příkladu je to /sedmicka
.
Alias /sedmicka "/www/hosting/vhtest.cz/sedmicka/"
<Directory /www/hosting/vhtest.cz/sedmicka>
<IfModule mod_proxy_fcgi.c>
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php7.4-fpm-vhtest.cz_sedmicka.sock|fcgi://localhost"
</FilesMatch>
</IfModule>
</Directory>
V hlavním configu Apache celé domény je potřeba následující změna linkování subdomén:
IncludeOptional sites-available/subdomains/vhtest.cz_*.conf
Tento Include je potřeba přesunout do hlavního sekce Macro
# ################ Macro vhtest.cz ####################
<Macro vhtest.cz>
ServerAdmin postmaster@vhtest.cz
ErrorLog /var/log/apache2/vhtest.cz/error-vhtest.cz.log
CustomLog /var/log/apache2/vhtest.cz/access-vhtest.cz.log combined
## odkomentovat, pokud se ma web presmerovavat automaticky z http na https - pozor, bude automaticky pro vsechny subdomeny!!!
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} !^/\.well\-known/acme\-challenge/ [NC]
# RewriteRule (.*) https://%{SERVER_NAME}$1 [R,L]
<Directory "/www/hosting/vhtest.cz">
Options -Indexes +FollowSymLinks -MultiViews +SymLinksIfOwnerMatch +IncludesNoExec -Includes
AllowOverride AuthConfig FileInfo Indexes Limit Options=Indexes,MultiViews,FollowSymLinks
<Limit GET POST OPTIONS>
Require all granted
</Limit>
<LimitExcept GET POST OPTIONS>
Require all denied
</LimitExcept>
Require all granted
<IfModule mod_access_compat.c>
Order allow,deny
Allow from all
</IfModule>
</Directory>
<IfModule mod_proxy_fcgi.c>
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php8.2-fpm-vhtest.cz.sock|fcgi://localhost"
</FilesMatch>
<LocationMatch "/php_status">
SetHandler "proxy:unix:/run/php8.2-fpm-vhtest.cz.sock|fcgi://localhost"
Require ip 127.0.0.1 95.168.219.1 ::1
</LocationMatch>
ProxyTimeout 360
</IfModule>
IncludeOptional sites-available/subdomains/vhtest.cz_*.conf
</Macro>
A následně smazat zbytek configu, kteý je za základní definicí virtualhostů pro porty 80 a 443 pro hlavní doménu.
Toto tedy ještě zůstane:
<VirtualHost *:443>
DocumentRoot /www/hosting/vhtest.cz/www
Servername vhtest.cz
ServerAlias www.vhtest.cz
ServerAlias www.vhtest.cz.ars05.vas-server.cz vhtest.cz.ars05.vas-server.cz
Use vhtest.cz
Use vhtest.cz-ssl
</VirtualHost>
A toto celé se smaže:
# ###################### subdomains - start ##########################
# Include will fail with an error
# IncludeOptional will silently ignore
IncludeOptional sites-available/subdomains/vhtest.cz_*.conf
# ###################### subdomains - end ##########################
# ###################### *.vhtest.cz ##########################
<VirtualHost *:80>
VirtualDocumentRoot /www/hosting/vhtest.cz/%-3+
ServerName stats.vhtest.cz
ServerAlias *.vhtest.cz
Use vhtest.cz
</VirtualHost>
<VirtualHost *:443>
VirtualDocumentRoot /www/hosting/vhtest.cz/%-3+
Servername stats.vhtest.cz
ServerAlias *.vhtest.cz
ServerAdmin postmaster@vhtest.cz
Use vhtest.cz
Use vhtest.cz-ssl
</VirtualHost>
# ###################### *.vhtest.cz ##########################
<VirtualHost *:80>
VirtualDocumentRoot /www/hosting/vhtest.cz/%-6+
ServerName stats.vhtest.cz.ars05.vas-server.cz
ServerAlias *.vhtest.cz.ars05.vas-server.cz
Use vhtest.cz
</VirtualHost>
<VirtualHost *:443>
VirtualDocumentRoot /www/hosting/vhtest.cz/%-6+
Servername stats.vhtest.cz.ars05.vas-server.cz
ServerAlias *.vhtest.cz.ars05.vas-server.cz
ServerAdmin postmaster@vhtest.cz
Use vhtest.cz
Use vhtest.cz-ssl
</VirtualHost>