Zwei Laravel Projekte auf einem Apache2 Webserver
Die gleiche IP Adresse aber zwei unterschiedliche URLs die auf unterschiedliche Projekte zeigen? Mit SSL Verschlüsselung? Ja, das ist relativ leicht machbar, wenn man weiß wie. Die Beschreibungen im Netz dazu sind oft nur für ein Projekt auf einem Server.
1) SSL Zertifikate
Sobald Du dein SSL Zertifikat per Mail erhalten hast, kannst Du es für deine Domain entsprechend einbinden. Dafür gibt es einige Anleitungen die ganz verlässlich funktionieren. Am Ende brauchst Du nur noch 3 Dateien:
Die 3 Dateien legst Du am besten auf deinem Server ab, z.b. in einem Ordner den Du dir erstellst á la : mkdir /etc/zertfikate/ssl/project1
.
Um nicht durcheinander zu kommen, kannst Du für jedes Projekt einen Ordner anlegen und entsprechende Zertifikate dort ablegen.
2) Virtual Hosts
Unverschlüsselt über http PORT 80
Um deine erste Website über deine erste URL erreichbar zu machen, erstellen wir eine conf Datei im Apache2 - SitesAvailable Ordner und fügen diese zum Server hinzu. Damit sagst Du dem Server, welches Projekt bei welcher URL angezeigt werden soll. Damit das funktioniert ist es wichtig den ServerName festzulegen und später in der ServerHost Datei entsprechend der IP Adresse des Servers zu zu ordnen. Zu erst erstellst Du aber z.b. die .conf Datei 'project1.conf' mit vim oder nano oder sonstigen Editoren auf deinem Server:vim /etc/apache2/sites-available/project1.conf
Der folgende Inhalt der Datei wird dein Laravel PHP Projekt aufrufen sobald die URL aufgerufen wird:
<VirtualHost *:80\>
ServerName project1
ServerAlias www.project1.de
DocumentRoot "/var/www/project1/public"
<Directory /var/www/project1>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Das gleiche machen wir für das zweite Projekt, welches über eine andere URL aufgerufen wird:
vim /etc/apache2/sites-available/project2.conf
<VirtualHost *:80\>
ServerName project2
ServerAlias www.project2.de
DocumentRoot "/var/www/project2/public"
<Directory /var/www/project2>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
SSL verschlüsselt über https PORT 443
Wenn Du SSL Zertifikate in einem Ordner für dein Projekt1 angelegt hast, musst du dem Server sagen wo er diese findet. Hier ist besonders zu beachten beim ServerName die URL anzugeben, also z.b. www.project1.de.vim /etc/apache2/sites-available/project1-ssl.conf
<IfModule mod_ssl.c>
<VirtualHost *:444>
ServerAdmin webmaster@localhost
ServerName www.project1.de
DocumentRoot /var/www/project1/public
<Directory /var/www/project1>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined
SSLEngine on
SSLCertificateFile /etc/zertfikate/ssl/project1/certficate.crt
SSLCertificateKeyFile /etc/zertfikate/ssl/project1/project1.key
SSLCACertificateFile /etc/zertfikate/ssl/project1/intermediateCA.crt
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-6]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
</VirtualHost>
</IfModule>
Das gleiche wiederholst Du für dein zweites Projekt, gibst aber die anderen 3 SSL Dateien (Key, Zertifikat, Serverzertifikat) an. vim /etc/apache2/sites-available/project2-ssl.conf
<IfModule mod_ssl.c>
<VirtualHost *:444>
ServerAdmin webmaster@localhost
ServerName www.project2.de
DocumentRoot /var/www/project2/public
<Directory /var/www/project2>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined
SSLEngine on
SSLCertificateFile /etc/zertfikate/ssl/project2/certficate.crt
SSLCertificateKeyFile /etc/zertfikate/ssl/project2/project2.key
SSLCACertificateFile /etc/zertfikate/ssl/project2/intermediateCA.crt
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-6]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
</VirtualHost>
</IfModule>
3) Server Host & Port File
Du musst auf deinem Server noch mod ssl aktivieren mitsudo a2enmod ssl
und der Konfiguration von vim /etc/apache2/ports.conf
mit
<IfModule ssl_module>
Listen 443
</IfModule>
Danach kannst Du die host Datei editieren und deine Projekte der IP Adresse des Servers zuweisen: vim /etc/hosts
10.200.300.400 project1 project2
Durch hinzufügen der Dateien und Neustart des Servers sollten deine URLs auf die entsprechenden Projekte verweisen.
sudo a2ensite project1.conf
sudo a2ensite project2.conf
sudo a2ensite project1-ssl.conf
sudo a2ensite project2-ssl.conf
sudo service apache2 restart
4) .htaccess von jedem Projekt
Um ggf. noch eine Umleitung von Subdomains und auf HTTPS zu erzwingen, kannst Du die .htaccess deiner Projekte jeweils entsprechend bearbeiten.vim /var/www/project1/public/.htaccess
<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On
</IfModule>
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\project1\.(de)$ [NC]
RewriteCond %{SERVER_PORT} !443
RewriteRule ^(.*)$ https://www.project1.de/$1 [L,R=301]
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
#WICHTIG: für das schreiben der routes in der LARAVEL APP
RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
RewriteRule ^(.*) - [E=BASE:%1]
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^index\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .? - [L]
RewriteRule .? %{ENV:BASE}/index.php [L]
</IfModule>
vim /var/www/project2/public/.htaccess
<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On
</IfModule>
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\project2\.(de)$ [NC]
RewriteCond %{SERVER_PORT} !443
RewriteRule ^(.*)$ https://www.project2.de/$1 [L,R=301]
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
#WICHTIG: für das schreiben der routes in der LARAVEL APP
RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
RewriteRule ^(.*) - [E=BASE:%1]
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^index\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .? - [L]
RewriteRule .? %{ENV:BASE}/index.php [L]
</IfModule>
Viel Erfolg!