# Webserver Konfiguration / PHP Snippets für Kunden



## MXP (11. Juni 2018)

Hallo zusammen,

aktuell bin ich dabei die Webserver Konfiguration einzurichten, damit unsere Kunden selber Konfigurationen auswählen können.
Das funktioniert soweit auch, wenn ich aber noch eine weitere Direktive unter Optionen hinzufüge, wird diese ignoriert. Ist das gewollt oder könnte das ein Fehler in der Konfiguration / ISPConfig sein?

Zudem möchte ich das unsere Kunden selber PHP Funktionen, die ich angebe, aktivieren / deaktivieren können. Scheinbar funktioniert das nicht wie mit der Webserver Konfiguration, denn meine PHP Direktiven die für Kunden sichtbar sein sollten, werden weder Admins noch dem Kunden angezeigt.
Ich meine das, dass schon einmal funktioniert hätte.

Ich hoffe das ist verständlich beschrieben.

*System:* Linux Debian 9
*Webserver:* Nginx mit Google Pagespeed
*PHP:* 5.6, 7.0, 7.1, 7.2 (ISPConfig läuft über 7.0)
*ISPConfig Version: *3.1.11

Danke schon mal im Voraus


----------



## florian030 (12. Juni 2018)

Du kannst Direktiven mit der Webserver-Config verbinden. D.h. wenn die Webserver-Config ausgewählt wird, werden die damit verknüpften Direktiven auch eingebunden.
Was meinst Du denn mit "selber PHP Funktionen, die ich angebe, aktivieren / deaktivieren können" bzw. wie legst Du die an? Ich würde PHP-Snippets ala "function A on" und "function B off" anlegen - die kann man dann gezielt auswählen. Das ist aber zusammen mit einer Webserver-Config mit Vorsicht zu genießen.


----------



## MXP (12. Juni 2018)

Zitat von florian030:


> Du kannst Direktiven mit der Webserver-Config verbinden. D.h. wenn die Webserver-Config ausgewählt wird, werden die damit verknüpften Direktiven auch eingebunden.


Das wäre an sich auch eine Idee aber es könnte ja sein, dass ein Kunde Funktionen, die ich dafür freigebe, nicht benötigt. Ich möchte den Kunden eine möglichst freie Auswahl bieten können.
Bestes Beispiel ist vielleicht ioncube. Nicht jeder braucht es, aber der Kunde soll es selbstständig aktivieren oder deaktivieren können.



Zitat von florian030:


> Was meinst Du denn mit "selber PHP Funktionen, die ich angebe, aktivieren / deaktivieren können"


Eigentlich genau das was ich oben beschrieben habe.
Ich meine damit ein PHP Snippet in ISPConfig anzulegen um diese mittels Checkboxen in der Web Domain Einstellung, nach Auswahl der Webserver Konfiguration, zu aktivieren bzw. zu deaktivieren. Eigentlich genau so wie du sagtest mit: 



Zitat von florian030:


> Ich würde PHP-Snippets ala "function A on" und "function B off" anlegen





Zitat von florian030:


> die kann man dann gezielt auswählen


Wo kann ich die dann gezielt auswählen? Als Admin klar im Optionen Tab. Aber als Kunde?


----------



## florian030 (13. Juni 2018)

> Das wäre an sich auch eine Idee aber es könnte ja sein, dass ein Kunde Funktionen, die ich dafür freigebe, nicht benötigt. Ich möchte den Kunden eine möglichst freie Auswahl bieten können.
> Bestes Beispiel ist vielleicht ioncube. Nicht jeder braucht es, aber der Kunde soll es selbstständig aktivieren oder deaktivieren können.


ioncube ist m.E. kein so gutes Beispiel. Das ist hier für jede PHP-Version in der globalen php.ini aktiv und gut ist. Ich habe so gar kein Interesse daran, einem Kunden zu erklären, wie und warum das aktiviert werden muss. 



> Eigentlich genau das was ich oben beschrieben habe.
> Ich meine damit ein PHP Snippet in ISPConfig anzulegen um diese mittels Checkboxen in der Web Domain Einstellung, nach Auswahl der Webserver Konfiguration, zu aktivieren bzw. zu deaktivieren. Eigentlich genau so wie du sagtest mit:


Wenn Du Checkboxen haben willst, musst Du den Sourcecode anpassen.



> Wo kann ich die dann gezielt auswählen? Als Admin klar im Optionen Tab. Aber als Kunde?


Du kannst eine Webserver-Config mit PHP-Snippets verbinden. Also meinetwegen eine Config "Wordpress" und dazu die passenden Snippets. Wählt der Kunde dann für seine Webseite dann die Config "Wordpress" wird das entsprechend gesetzt. nginx-direktiven unter Optionen werden ggf. überschrieben, weil diese nachrangig sind. Über die inidividuellen php-Settings kannst Du Werte anpassen - diese überschreiben dann die Einstellungen aus der gewählten Config.

An den Option-Tab kommt man als Kunde nicht - das geht bestenfalls ab Reseller.

Die meisten Kunden wollen doch nur, dass das ganze läuft und denen ist es herzlich egal, was da an PHP im Hintergrund passiert?


----------



## snocer (8. Juli 2018)

Hi Florian auch wir hatten schon mal das Thema. Das mit den Snippets ist ein Workaround aber keine echte Lösung auch in meinen Augen nicht. Je nach installierten Plugins, Modulen und Komponenten, muss ich alleine für Joomla! schon mindesten 20 erstellen um alle Kundenfälle abdecken zu können. Das gleiche dann noch für WordPress, Magento etc. und schon blickt kein Kunde mehr durch. Den die benötigten Einstellungen werden ihm ja erst während der Installation angezeigt. Wenn er kann abbrechen andere Server Config wählen und das Glück aufs neue. Unter Komfort verstehe ich auch was anderes. Na vielleicht kommen ja doch noch mal Checkboxen auch für den Kunden.


----------



## snocer (8. Juli 2018)

Ach noch etwas, wie stellst Du dir denn das jetzt vor. Ein Kunde findet seine Konstellation nicht die er für seine Komponenten benötigt zu Beispiel 256MB, jetzt erstellen wir für ihn wieder eine Konfiguration und der nächste Kunde wählt diese dann bei seiner zum Beispiel Joomla! Installation aus und und bräuchte aber eigentlich nur 128MB oder 64MB was für die meisten Standard Joomla! Installationen auch reicht. Ich sage dir der Endkunde wählt das größte, weil er ja meint er zahlt ja für alles, ob er es brauch oder nicht.


----------



## florian030 (9. Juli 2018)

Wir haben hier ein paar Vorlagen, die für die typischen CMS passen - und das wählt man dann eben aus. Wenn jemand mal mehr braucht, dann wird das manuell hochgesetzt. Das ist ja nun wirklich die Außnahme.


----------



## snocer (9. Juli 2018)

Danke für die Antwort. Unter welcher Rubrik stehe die Vorlagen? Ich kann diese bei Dir nicht finden.


----------



## florian030 (11. Juli 2018)

Ich wüsste ehrlich gesagt nicht, wie Du die bei mir finden willst. Ich kann mich nicht daran erinnern, dass Du einen Managed-Server bei mir hast?


----------



## snocer (15. Juli 2018)

Ich denke wir reden aneinander vorbei. Es ging um die Einstellungen und Vorlagen in ispConfig. Du antwortest mit Deinen eventuellen Vorlagen und sprichst dann von Managed Servern. Natürlich haben wir keine Managed Server bei Dir. Davon war auch nirgends die Rede. Ich denke wir lassen das Thema das führt hier zu keinem Ergebnis. Da es diese Optionen so wie angefragt nicht gibt in ispConfig und auf die bereits hin gewießenen Probleme der einzelnen hier nicht eingeggangen wird ist es müssig hier das Thema weiter zu vertiefen.
Hier muss man dann klar auf Plesk verweißen, wo so etwas problemlos möglich ist. Und wen ich dann noch die Jahresgebühren von Dir und Plesk vergleiche, bin ich bei Plesk auch nicht schlechter dran 120 EUR / a pro Server und habe innerhalb 30 Minuten einen Rückruf bzw. innerhalb max. 24 Stunden eine Lösung für ein bestehendes Problem.


----------



## MXP (16. Juli 2018)

Ich finde es auf jeden Fall schade das dort in diese Richtung nichts gemacht wird.
Ich dachte mir schon das ich doch nicht der einzige sein kann, der so eine Funktion vermisst.
Jeder Hosting Provider den ich kenne, bietet seinem Kunden so eine Möglichkeit.

Plesk kommt für mich aber absolut nicht in Frage, allein schon weil es auf Ubuntu basiert (ist aber eine andere Geschichte)
Dann muss ich eventuell unsere Programmierer bemühen aber bei jeder Aktualisierung werden die Änderungen ja auch wieder verworfen, weswegen ich eigentlich nicht in den Code eingreifen wollte.


----------



## Till (16. Juli 2018)

Zitat von MXP:


> Ich finde es auf jeden Fall schade das dort in diese Richtung nichts gemacht wird.
> Ich dachte mir schon das ich doch nicht der einzige sein kann, der so eine Funktion vermisst.
> Jeder Hosting Provider den ich kenne, bietet seinem Kunden so eine Möglichkeit.


Dann erstelle doch die config Snippets und veröffentliche sie. So funktioniert OpenSource. Dies betrifft übrigens auch @snocer.

Ich finde es immer wieder toll wie sich Leute hier beschweren die ISPConfig kommerziell einsetzen wollen dass andere Leute kostenlos nicht schnell genug für sie arbeiten oder nicht das erstellen was sie jetzt gerade haben wollen. Rafft Euch mal auf und tragt selbst dazu bei anstatt rum zu jammern!



Zitat von MXP:


> Dann muss ich eventuell unsere Programmierer bemühen aber bei jeder Aktualisierung werden die Änderungen ja auch wieder verworfen, weswegen ich eigentlich nicht in den Code eingreifen wollte.


Snippets sind eine Funktion in ISPConfig, da muss man also keinen Code für ändern, lediglich die Snippets erstellen. Und Wenn Du die Funktionen erweitern möchtest, dann kannst Du dies ja gern machen und Deine Änderungen im ISPConfig GIT Server zum Mergen hochladen. So ist es wie andere Hoster die ISPConfig einsetzen dies machen, die Funktionen in ISPConfig entstehen nicht 'aus dem nichts' sondern sie werden von Programmieren entwickelt, viele von denen werden von Hostern dafür bezahlt, und dann wird der Code der Community zur Verfügung gestellt.


----------



## MXP (16. Juli 2018)

Hi Till,

so war das auch nicht gemeint, sorry wenn es jetzt vielleicht etwas fordernd oder gar respektlos rüber kam.
Mir ist es durchaus bewusst das es sich um Open Source Software handelt. Darum sagte ich ja auch das ich das mal an unsere Programmierer weitergebe und sich das mal anschauen sollen.
Es ist gut selber Hand anlegen zu können. Mich wundert es auch nur, dass scheinbar keiner der das Feature möchte, die initiative ergreift oder einfach nicht der Community zur Verfügung stellen will.
Aber genau aus diesem Grund setze ich Persönlich lieber auf Open Source, weil eben jeder daran arbeiten kann. Das ist auch mit einer der Gründe warum wir hier kein Plesk einsetzen möchten.

Gäbe es vielleicht eine Möglichkeit Änderungen am Code auch nach einem Update zu behalten?
Wenn nicht ist das auch erstmal nicht tragisch.

Dann müssen wir jetzt erstmal die Zeit finden das zu machen bei dem ganzen DSGVO Wahnsinn aktuell.


----------



## Till (16. Juli 2018)

Zitat von MXP:


> Gäbe es vielleicht eine Möglichkeit Änderungen am Code auch nach einem Update zu behalten?


Entweder Du committest sie im offiziellen ISPConfig GIT, wenn sie upstream angenommen werden sind sie ja in der nächsten version drin. Oder aber deine Entwickler pflegen ein eigenes GIT Repository für Deinen Fork von ISPConfig.


----------



## snocer (16. Juli 2018)

Zitat von Till:


> Dann erstelle doch die config Snippets und veröffentliche sie. So funktioniert OpenSource. Dies betrifft übrigens auch @snocer.
> 
> Ich finde es immer wieder toll wie sich Leute hier beschweren die ISPConfig kommerziell einsetzen wollen dass andere Leute kostenlos nicht schnell genug für sie arbeiten oder nicht das erstellen was sie jetzt gerade haben wollen. Rafft Euch mal auf und tragt selbst dazu bei anstatt rum zu jammern!
> 
> ...


Womit Du auch Recht hast. Ich werde mich auch mal bemühen etwas beizusteuern. Erst einmal Danke für Deine Top Arbeit. Ich würde auch Spenden wen Euch das hilft. Meine Zeit ist sehr eng bemessen. Aber wie Du schon sagtest auch ein zurück geben, davon lebt Open Source. Ich habe nächste Woche ein paar Tage frei. Entweder Snippets oder auch mal ein Theme aber dazu muss ich mich noch etwas tiefer einarbeiten.


----------



## Till (16. Juli 2018)

Um hier mal den Anfang zu machen, hier ist ein config snippet für OwnCloud und NextCloud:

https://www.howtoforge.com/communit...x-ceontos-6-5-on-vps.68139/page-2#post-372208

Und Magento 2:


```
location ~ \.php$ { ##delete##
}
location @php { ##delete##
}

set $MAGE_ROOT {DOCROOT};

##subroot pub ##

index index.php;
autoindex off;
charset UTF-8;
error_page 404 403 = /errors/404.php;

location ~* ^/setup($|/) {
    root $MAGE_ROOT;
    location ~ ^/setup/index.php {
        {FASTCGIPASS}

        fastcgi_param  PHP_FLAG  "session.auto_start=off \nsuhosin.session.cryptua=off";
        fastcgi_param  PHP_VALUE "memory_limit=768M \nmax_execution_time=600";
        fastcgi_read_timeout 600s;
        fastcgi_connect_timeout 600s;

        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        /etc/nginx/fastcgi_params;
    }

    location ~ ^/setup/(?!pub/). {
        deny all;
    }

    location ~ ^/setup/pub/ {
        add_header X-Frame-Options "SAMEORIGIN";
    }
}

location ~* ^/update($|/) {
    root $MAGE_ROOT;

    location ~ ^/update/index.php {
        fastcgi_split_path_info ^(/update/index.php)(/.+)$;
        {FASTCGIPASS}
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_param  PATH_INFO        $fastcgi_path_info;
        include        /etc/nginx/fastcgi_params;
    }

    # Deny everything but index.php
    location ~ ^/update/(?!pub/). {
        deny all;
    }

    location ~ ^/update/pub/ {
        add_header X-Frame-Options "SAMEORIGIN";
    }
}

location / {
    try_files $uri $uri/ /index.php$is_args$args;
}

location /pub/ {
    location ~ ^/pub/media/(downloadable|customer|import|theme_customization/.*\.xml) {
        deny all;
    }
    alias $MAGE_ROOT/pub/;
    add_header X-Frame-Options "SAMEORIGIN";
}

location /static/ {
    # Uncomment the following line in production mode
    # expires max;

    # Remove signature of the static files that is used to overcome the browser cache
    location ~ ^/static/version {
        rewrite ^/static/(version\d*/)?(.*)$ /static/$2 last;
    }

    location ~* \.(ico|jpg|jpeg|png|gif|svg|js|css|swf|eot|ttf|otf|woff|woff2)$ {
        add_header Cache-Control "public";
        add_header X-Frame-Options "SAMEORIGIN";
        expires +1y;

        if (!-f $request_filename) {
            rewrite ^/static/?(.*)$ /static.php?resource=$1 last;
        }
    }
    location ~* \.(zip|gz|gzip|bz2|csv|xml)$ {
        add_header Cache-Control "no-store";
        add_header X-Frame-Options "SAMEORIGIN";
        expires    off;

        if (!-f $request_filename) {
           rewrite ^/static/?(.*)$ /static.php?resource=$1 last;
        }
    }
    if (!-f $request_filename) {
        rewrite ^/static/?(.*)$ /static.php?resource=$1 last;
    }
    add_header X-Frame-Options "SAMEORIGIN";
}

location /media/ {
    try_files $uri $uri/ /get.php$is_args$args;

    location ~ ^/media/theme_customization/.*\.xml {
        deny all;
    }

    location ~* \.(ico|jpg|jpeg|png|gif|svg|js|css|swf|eot|ttf|otf|woff|woff2)$ {
        add_header Cache-Control "public";
        add_header X-Frame-Options "SAMEORIGIN";
        expires +1y;
        try_files $uri $uri/ /get.php$is_args$args;
    }
    location ~* \.(zip|gz|gzip|bz2|csv|xml)$ {
        add_header Cache-Control "no-store";
        add_header X-Frame-Options "SAMEORIGIN";
        expires    off;
        try_files $uri $uri/ /get.php$is_args$args;
    }
    add_header X-Frame-Options "SAMEORIGIN";
}

location /media/customer/ {
    deny all;
}

location /media/downloadable/ {
    deny all;
}

location /media/import/ {
    deny all;
}

# PHP entry point for main application
location ~ (index|get|static|report|404|503)\.php$ {
    try_files $uri =404;
    {FASTCGIPASS}
    fastcgi_buffers 1024 4k;

    fastcgi_param  PHP_FLAG  "session.auto_start=off \nsuhosin.session.cryptua=off";
    fastcgi_param  PHP_VALUE "memory_limit=768M \nmax_execution_time=18000";
    fastcgi_read_timeout 600s;
    fastcgi_connect_timeout 600s;

    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        /etc/nginx/fastcgi_params;
}

location ~* (\.php$|\.htaccess$|\.git) {
    deny all;
}
```
und zum Schluss was einfaches: WordPress:


```
location / {
                try_files $uri $uri/ /index.php?$args;
       }
       # Add trailing slash to */wp-admin requests.
       rewrite /wp-admin$ $scheme://$host$uri/ permanent;
       location ~*  \.(jpg|jpeg|png|gif|css|js|ico)$ {
                expires max;
                log_not_found off;
       }
```
WordPress geht sicherlich auch detaillierter, aber es sollte so funktionieren.


----------



## nowayback (16. Juli 2018)

Für wordpress kann ich ja auch mal was reinschmeißen... Teile davon lassen sich auch bei anderen Dingen wiederverwenden ;-)


```
# cache media files
        location ~* \.(asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|eot|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|odb|odc|odf|odg|odp|ods|odt|ogg|ogv|otf|pdf|png|pot|pps|ppt|pptx|ra|ram|svg|svgz|swf|tar|t?gz|tif|tiff|ttf|wav|webm|wma|woff|wri|xla|xls|xlsx|xlt|xlw|zip)$ {
                expires max;
                access_log off;
                log_not_found off;
                add_header Pragma public;
                add_header Cache-Control "max-age=31536000, public";
        }

        # cache css + js files
        location ~* ^.+\.(css|js)$ {
                rewrite ^(.+)\.(\d+)\.(css|js)$ $1.$3 last;
                expires max;
                access_log off;
                log_not_found off;
                add_header Pragma public;
                add_header Cache-Control "max-age=31536000, public";
        }

        # pagespeed with memcached
        pagespeed MemcachedThreads 1;
        pagespeed MemcachedServers "localhost:11211";

        pagespeed RewriteLevel CoreFilters;
        pagespeed EnableFilters collapse_whitespace,remove_comments;

        location ~ "\.pagespeed\.([a-z]\.)?[a-z]{2}\.[^.]{10}\.[^.]+" {
            add_header "" "";
        }
        location ~ "^/ngx_pagespeed_static/" {
        }
        location ~ "^/ngx_pagespeed_beacon$" {
        }
        location /ngx_pagespeed_statistics {
            allow 127.0.0.1; deny all;
        }
        location /ngx_pagespeed_message {
            allow 127.0.0.1; deny all;
        }

       # seo urls
        rewrite /wp-admin$ $scheme://$host$uri/ permanent;

        location / {
            try_files $uri $uri/ /index.php?$args;
        }

        # memcached for wp
        location @memcached {
            default_type text/html;
            set $memcached_key data-$scheme://$host$request_uri;
            set $memcached_request 1;

            if ($request_method = POST ) {
                    set $memcached_request 0;
            }

            if ( $uri ~ "/wp-" ) {
                    set $memcached_request 0;
            }

            if ( $uri ~ "/aNotToCacheUri" ) {
                    set $memcached_request 0;
            }

            if ( $args ) {
                    set $memcached_request 0;
            }

            if ($http_cookie ~* "comment_author_|wordpressuser_|wp-postpass_|wordpress_logged_in_" ) {
                    set $memcached_request 0;
            }

            if ( $memcached_request = 1) {

                memcached_pass     127.0.0.1:11211;
                error_page 404 = @rewrites;
            }

            if ( $memcached_request = 0) {
                    rewrite ^ /index.php last;
            }
        }

        location @rewrites {
            add_header X-Cache-Engine "";
            rewrite ^ /index.php last;
        }
```
Grüße
nwb


----------



## nowayback (16. Juli 2018)

weil man nur Beiträge mit 10000 Zeichen erstellen kann, hier noch ein kleiner Botfilter :-D

```
# no bots or untrusted user agent allowed
        if ($http_user_agent ~* "^[Ww]eb[Bb]andit"){ return 403; }
        if ($http_user_agent ~* "^binlar"){ return 403; }
        if ($http_user_agent ~* "^BlackWidow"){ return 403; }
        if ($http_user_agent ~ "^Bolt"){ return 403; }
        if ($http_user_agent ~* "^casper"){ return 403; }
        if ($http_user_agent ~* "^ChinaClaw"){ return 403; }
        if ($http_user_agent ~* "^cmsworldmap"){ return 403; }
        if ($http_user_agent ~* "^comodo"){ return 403; }
        if ($http_user_agent ~* "^Custo"){ return 403; }
        if ($http_user_agent ~ "^Default"){ return 403; }
        if ($http_user_agent ~* "^diavol"){ return 403; }
        if ($http_user_agent ~* "^DIIbot"){ return 403; }
        if ($http_user_agent ~* "^DISCo"){ return 403; }
        if ($http_user_agent ~* "^dotbot"){ return 403; }
        if ($http_user_agent ~* "^eCatch"){ return 403; }
        if ($http_user_agent ~* "^EirGrabber"){ return 403; }
        if ($http_user_agent ~* "^EmailCollector"){ return 403; }
        if ($http_user_agent ~* "^EmailSiphon"){ return 403; }
        if ($http_user_agent ~* "^EmailWolf"){ return 403; }
        if ($http_user_agent ~* "^ExtractorPro"){ return 403; }
        if ($http_user_agent ~* "^EyeNetIE"){ return 403; }
        if ($http_user_agent ~* "^feedfinder"){ return 403; }
        if ($http_user_agent ~* "^FlashGet"){ return 403; }
        if ($http_user_agent ~* "^flicky"){ return 403; }
        if ($http_user_agent ~* "^GetRight"){ return 403; }
        if ($http_user_agent ~* "^GetWeb!"){ return 403; }
        if ($http_user_agent ~* "^Go-Ahead-Got-It"){ return 403; }
        if ($http_user_agent ~* "^Go!Zilla"){ return 403; }
        if ($http_user_agent ~* "^GrabNet"){ return 403; }
        if ($http_user_agent ~* "^Grafula"){ return 403; }
        if ($http_user_agent ~* "^HMView"){ return 403; }
        if ($http_user_agent ~* "^ia_archiver"){ return 403; }
        if ($http_user_agent ~* "^InterGET"){ return 403; }
        if ($http_user_agent ~* "^InternetSeer.com"){ return 403; }
        if ($http_user_agent ~* "^jakarta"){ return 403; }
        if ($http_user_agent ~* "^Java"){ return 403; }
        if ($http_user_agent ~* "^JetCar"){ return 403; }
        if ($http_user_agent ~* "^kmccrew"){ return 403; }
        if ($http_user_agent ~* "^larbin"){ return 403; }
        if ($http_user_agent ~* "^LeechFTP"){ return 403; }
        if ($http_user_agent ~* "^Link"){ return 403; }
        if ($http_user_agent ~* "^Maxthon$"){ return 403; }
        if ($http_user_agent ~* "^microsoft.url"){ return 403; }
        if ($http_user_agent ~* "^Mozilla.*Indy"){ return 403; }
        if ($http_user_agent ~* "^Mozilla.*NEWT"){ return 403; }
        if ($http_user_agent ~* "^MSFrontPage"){ return 403; }
        if ($http_user_agent ~* "^Navroad"){ return 403; }
        if ($http_user_agent ~* "^NearSite"){ return 403; }
        if ($http_user_agent ~* "^NetAnts"){ return 403; }
        if ($http_user_agent ~* "^NetSpider"){ return 403; }
        if ($http_user_agent ~* "^NetZIP"){ return 403; }
        if ($http_user_agent ~* "^nutch"){ return 403; }
        if ($http_user_agent ~* "^Octopus"){ return 403; }
        if ($http_user_agent ~* "^PageGrabber"){ return 403; }
        if ($http_user_agent ~* "^pavuk"){ return 403; }
        if ($http_user_agent ~* "^pcBrowser"){ return 403; }
        if ($http_user_agent ~* "^PeoplePal"){ return 403; }
        if ($http_user_agent ~* "^planetwork"){ return 403; }
        if ($http_user_agent ~* "^psbot"){ return 403; }
        if ($http_user_agent ~* "^purebot"){ return 403; }
        if ($http_user_agent ~* "^pycurl"){ return 403; }
        if ($http_user_agent ~* "^Rainmeter") { return 404; }
        if ($http_user_agent ~* "^RealDownload"){ return 403; }
        if ($http_user_agent ~* "^ReGet"){ return 403; }
        if ($http_user_agent ~* "^Rippers"){ return 403; }
        if ($http_user_agent ~* "^SeaMonkey$"){ return 403; }
        if ($http_user_agent ~* "^sitecheck.internetseer.com"){ return 403; }
        if ($http_user_agent ~* "^SiteSnagger"){ return 403; }
        if ($http_user_agent ~* "^skygrid"){ return 403; }
        if ($http_user_agent ~* "^SmartDownload"){ return 403; }
        if ($http_user_agent ~* "^sucker"){ return 403; }
        if ($http_user_agent ~* "^SuperBot"){ return 403; }
        if ($http_user_agent ~* "^SuperHTTP"){ return 403; }
        if ($http_user_agent ~* "^Surfbot"){ return 403; }
        if ($http_user_agent ~* "^tAkeOut"){ return 403; }
        if ($http_user_agent ~* "^Teleport"){ return 403; }
        if ($http_user_agent ~* "^Toata"){ return 403; }
        if ($http_user_agent ~* "^turnit"){ return 403; }
        if ($http_user_agent ~* "^vikspider"){ return 403; }
        if ($http_user_agent ~* "^VoidEYE"){ return 403; }
        if ($http_user_agent ~* "^WebAuto"){ return 403; }
        if ($http_user_agent ~* "^WebCopier"){ return 403; }
        if ($http_user_agent ~* "^WebFetch"){ return 403; }
        if ($http_user_agent ~* "^WebLeacher"){ return 403; }
        if ($http_user_agent ~* "^WebReaper"){ return 403; }
        if ($http_user_agent ~* "^WebSauger"){ return 403; }
        if ($http_user_agent ~* "^WebStripper"){ return 403; }
        if ($http_user_agent ~* "^WebWhacker"){ return 403; }
        if ($http_user_agent ~* "^WebZIP"){ return 403; }
        if ($http_user_agent ~* "^Widow"){ return 403; }
        if ($http_user_agent ~* "^WWW-Mechanize"){ return 403; }
        if ($http_user_agent ~* "^WWWOFFLE"){ return 403; }
        if ($http_user_agent ~* "^Zeus"){ return 403; }
        if ($http_user_agent ~* "^zmeu"){ return 403; }
        if ($http_user_agent ~* "CazoodleBot"){ return 403; }
        if ($http_user_agent ~* "discobot"){ return 403; }
        if ($http_user_agent ~* "ecxi"){ return 403; }
        if ($http_user_agent ~* "GT::WWW"){ return 403; }
        if ($http_user_agent ~* "heritrix"){ return 403; }
        if ($http_user_agent ~* "HTTP::Lite"){ return 403; }
        if ($http_user_agent ~* "HTTrack"){ return 403; }
        if ($http_user_agent ~* "ia_archiver"){ return 403; }
        if ($http_user_agent ~* "id-search"){ return 403; }
        if ($http_user_agent ~* "id-search.org"){ return 403; }
        if ($http_user_agent ~* "IDBot"){ return 403; }
        if ($http_user_agent ~* "IRLbot"){ return 403; }
        if ($http_user_agent ~* "LinksManager.com_bot"){ return 403; }
        if ($http_user_agent ~* "linkwalker"){ return 403; }
        if ($http_user_agent ~* "lwp-trivial"){ return 403; }
        if ($http_user_agent ~* "MFC_Tear_Sample"){ return 403; }
        if ($http_user_agent ~* "panscient.com"){ return 403; }
        if ($http_user_agent ~* "PECL::HTTP"){ return 403; }
        if ($http_user_agent ~* "PHPCrawl"){ return 403; }
        if ($http_user_agent ~* "PleaseCrawl"){ return 403; }
        if ($http_user_agent ~* "SBIder"){ return 403; }
        if ($http_user_agent ~* "Snoopy"){ return 403; }
        if ($http_user_agent ~* "Steeler"){ return 403; }
        if ($http_user_agent ~* "URI::Fetch"){ return 403; }
        if ($http_user_agent ~* "urllib"){ return 403; }
        if ($http_user_agent ~* "User-Agent"){ return 403; }
        if ($http_user_agent ~* "webalta"){ return 403; }
        if ($http_user_agent ~* "WebCollage"){ return 403; }
        if ($http_user_agent ~* "zermelo"){ return 403; }
        if ($http_user_agent ~* "ZyBorg"){ return 403; }
```


----------



## MXP (17. Juli 2018)

Zu Wordpress kann ich auch noch was beisteuern, wenn ich dazu komme mit Multisite Unterstützung für Subdomains und Subfolders, wobei zweiteres kein Problem ist.

@Till
Danke für die Magento2 Config, damit haben ein Kollege und ich schon eine Ganze weile gesessen, vielleicht hilft das Snippet weiter. Kommt das mit dem Multishop System zurecht? Dabei hatten wir Probleme da Magento2 dafür eigentlich eine MAP will.
Ansonsten schauen wir mal was man da machen kann.

Zeit mäßig haben wohl gerade viele, nicht nur in dieser Branche, zu kämpfen


----------

