Nadal szukam optymalnego rozwiązania dla dystrybucji tego pliku ale za długo to trwa…
Wklejam poniżej .htaccess z prezentacji wygłoszonej podczas Wordup Trójmiasto mam nadzieję że dobrze opisany, choć pozbawiony niektórych (mniej wordpressowych) treści omawianych podczas prezentacji.
Dla niecierpliwych .htaccess dla wordpressa pobierz i zapisz jako .htaccess
## trochę podrasowany .htaccess pod wordpresa
## 19.12.2017
## wersja zgodna z apache 2.2 (i hostingami akceptującymi te znaczniki)
## używasz na własną odpowiedzialność :) #SOA1
## niektóre wtyczki/motywy dopisują swoje regółki do .htaccess więc zacznij od skopiowania swojego obecnego pliku .htaccess żeby było co przywrócić w czarnej godzinie
## w tym pliku skasuj pojedyncze # na początkach linii
## jak wiesz co robisz możesz skasować również i podwójne # w niektórych liniach
## dopasuj konfigurację ścieżek do plików zamieszczonych na Twoim serwerze
## utwórz plik z hasłami .htpasswd (https://goo.gl/sZJBbz) najlepiej w katalogu niedostępnym z poziomu www
## wgraj ten plik (który właśnie czytasz) w katalog główny wordpressa pod nazwą .htaccess
## oczywiście jeżeli zawarte tu parametry/warunki są niewystarczające należy je zmienić
## nieużywane przez siebie sekcje skasuj, większość alternatywnych jest oznaczona poprzez (można skasować)
## znajdź 666.666.666.666 i podmień na adres IP z którego się łączysz
## utwórz pliki .htaccess opisane w sekcji „inne katalogi” (nie zapomnij skasować w nich #)
## rozważ zmianę uprawnień do pliku .htaccess opisane w sekcja „prawa dostępu”
## skasuj wszystko poniżej linii # END WordPress
## wpadnij na wordup warszawa napić się rumu z @bibliotekarz
## aktualizacje pliku znajdziesz pod adresem http://am.vj.pl/2017/01/22/htaccess-do-wordpressa/
## wyłaczamy podpis serwera
# ServerSignature Off
## dodanie/zmiana sposobu obsługi plików mime types możesz dodać własne typy plików (można skasować)
# AddType application/x-shockwave-flash .swf
# AddType video/x-flv .flv
# AddType image/x-icon .ico
## dodanie nagłówka na cześć Terrego Pracheta (jesli lubisz jego twórczość) (można skasować)
# <IfModule headers_module>
# header set X-Clacks-Overhead „GNU Terry Pratchett”
# </IfModule>
## dodanie nagłówków blokujących ataki XSS
# <IfModule mod_headers.c>
# Header set X-Content-Type-Options nosniff
# </IfModule>
# <IfModule mod_headers.c>
# Header set X-XSS-Protection „1; mode=block”
# </IfModule>
## ograniczanie wielkości pliku przesyłanego na serwer z poziomu apacza w bajtach, 0-2147483647(2GB)
## poniżej ograniczenie do 10BM
# LimitRequestBody 10240000
## dodatkowe parametry dla php zwiększające
## rozmiar uploadu dla pojedyńczego pliku
# php_value upload_max_filesize 25M
## rozmiar upload dla wielu plików jednocześnie wysyłanych (czyli powinno być większe równe upload_max_filesize)
# php_value post_max_size 50M
## wydłużenie czasu wykonywania skryptu
# php_value max_execution_time 300
## wydłużenie czasu uploadu
# php_value max_input_time 300
###########################
## pakowanie i keszowanie #
###########################
## tworzenie znaczników ETag (można skasować)
## można wdrozyć ale lepiej się skupić na Expires (poniżej)
# <Files „\.(gif|jpe?g|png|pdf)$”>
# FileETag MTime Size
# </Files>
# <IfModule mod_expires.c>
# ExpiresActive On
# ExpiresByType image/jpg „access plus 1 year”
# ExpiresByType image/jpeg „access plus 1 year”
# ExpiresByType image/gif „access plus 1 year”
# ExpiresByType image/png „access plus 1 year”
# ExpiresByType text/css „access plus 1 month”
# ExpiresByType application/pdf „access plus 1 month”
# ExpiresByType text/x-javascript „access plus 1 month”
# ExpiresByType application/x-shockwave-flash „access plus 1 month”
# ExpiresByType image/x-icon „access plus 1 year”
# ExpiresDefault „access plus 2 days”
# </IfModule>
## wersja dla serwisów na home.pl bo u nich nie działają dyrektywy przytoczone powyższe (można skasować)
# :Location /*.(gif|jpg|png|jpeg|ico)
# Expires A3110400
# :Location
# :Location /*.(txt|css|js|php|pl)
# Expires A2592000
# :Location
# :Location /*.(html|htm)
# Expires A86400
# :Location
## na home.pl nie działa FilesMach (można skasować tylko w przypadku home.pl)
## 2592000 = 30 dni, 864000 = 10 dni
# <ifModule mod_headers.c>
# <FilesMatch „\.(js|css|xml|gz|html)$”>
# Header append Vary: Accept-Encoding
# </FilesMatch>
# Header unset ETag
# <filesMatch „\\.(ico|pdf|flv|jpg|jpeg|png|gif|swf)$”>
# Header set Cache-Control „max-age=2592000, public”
# </filesMatch>
# <filesMatch „\\.(css)$”>
# Header set Cache-Control „max-age=864000, private”
# </filesMatch>
# <filesMatch „\\.(js)$”>
# Header set Cache-Control „max-age=864000, private”
# </filesMatch>
# <filesMatch „\\.(xml|txt)$”>
# Header set Cache-Control „max-age=2592000, public, must-revalidate”
# </filesMatch>
# <filesMatch „\\.(html|htm|php)$”>
# Header set Cache-Control „max-age=864000, private, must-revalidate”
# </filesMatch>
# </ifModule>
## włączanie kompresji
# <IfModule mod_deflate.c>
# AddOutputFilterByType DEFLATE text/text
# AddOutputFilterByType DEFLATE text/html
# AddOutputFilterByType DEFLATE text/css
# AddOutputFilterByType DEFLATE text/javascript
# AddOutputFilterByType DEFLATE text/xml
# AddOutputFilterByType DEFLATE text/plain
# AddOutputFilterByType DEFLATE image/x-icon
# AddOutputFilterByType DEFLATE image/svg+xml
# AddOutputFilterByType DEFLATE application/rss+xml
# AddOutputFilterByType DEFLATE application/javascript
# AddOutputFilterByType DEFLATE application/x-javascript
# AddOutputFilterByType DEFLATE application/xml
# AddOutputFilterByType DEFLATE application/xhtml+xml
## Zachowanie zgodności ze starymi przeglądarkami
# BrowserMatch ^Mozilla/4 gzip-only-text/html
# BrowserMatch ^Mozilla/4\.0[678] no-gzip
# BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# SetOutputFilter DEFLATE
# SetEnvIfNoCase RequestURI .(?:gif|jpe?g|png)$ no-gzip dont-vary
# SetEnvIfNoCase RequestURI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
# SetEnvIfNoCase Request_URI .pdf$ no-gzip dont-vary
# </IfModule>
## tylko jeśli nie serwer nie obsługuje mod_deflate inaczej (można skasować)
# <ifModule mod_gzip.c>
# mod_gzip_on Yes
# mod_gzip_dechunk Yes
# mod_gzip_item_include file \.(html?|txt|css|js|php|pl)$
# mod_gzip_item_include mime ^application/x-javascript.*
# mod_gzip_item_include mime ^text/.*
# mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
# mod_gzip_item_exclude mime ^image/.*
# mod_gzip_item_include handler ^cgi-script$
# </ifModule>
################
## autoryzacja #
################
### jeśli potrzebujesz blokowania wszystkiego dostęp po podaniu hasła (można skasować)
## AuthName „No pasaran test_jakis_opis”
## AuthType Basic
## AuthUserFile /sciezka/serwera/najlepiej/przed/katalogiem/widocznym/z/poziomu/www/.htpasswd
## Require valid-user
## konieczne żeby wyciąć boty
# <Files wp-login.php>
# AuthType Basic
# AuthName „Czego tu szukasz”
# AuthUserFile /sciezka/serwera/najlepiej/przed/katalogiem/widocznym/z/poziomu/www/.htpasswd
# require valid-user
# </Files>
### wygodniejsza blokada z dostępem bez hasła (na podstawie adresu IP) możesz podać wiele adresów lub klasę sieci (można skasować)
## <Files wp-login.php>
## AuthType Basic
## require valid-user
## Order allow,deny
## Allow from 666.666.666.666
## Allow from 666.666.666.
## Satisfy Any
## </Files>
### ograniczenie dostępu tylko do lokalnej sieci i domeny tere.vj.pl (można skasować)
## <Limit GET POST PUT>
## order deny,allow
## deny from all
## allow from 192.168.0.0/24
## allow from .tere\.vj\.pl.*
## możemy jednak zablokować niechcianych
## deny from 192.168.0.19
## </Limit>
###################
## przekierowania #
###################
## 401 – Unauthorized przekierowanie na jakiś inny adres
## ErrorDocument 401 http://vj.pl/401.html
## 403 – Forbidden brak dostępu przekierowanie na lokalny plik
## ErrorDocument 403 /dostep_zablokowany.html
## 404 – Not Found czyli nie znaleziono wyświetli komunikat zawarty w cudzysłowach
## przekierowanie nie zadziała przy włączonych przyjaznych adresach w wordpressie
## ErrorDocument 404 „<h1>404</h1> <h2>oznacza że nie znaleziono tego pliku</h2>”
## 410 – Gone czyli niema i nie będzie wyświetli komunikat zawarty w cudzysłowach
## ErrorDocument 410 „plik zakończył żywot i nie wróci z tamtego świata<br>410”
## 500 – error czyli błąd serwera przekierowanie na lokalny plik
## ErrorDocument 500 /padla.html
## 301 przekierowanie permanentne na zawsze pod SEO dopasuj jeśli potrzebijesz lub skasuj sekcję
## Redirect 301 /duda.html http://prezydent.pl
## Redirect 301 /stary-folder/duda.html /nowy-folder/duda-nowy-ta-sama-domena.html
## Redirect 301 / http://vj.pl
## 302 przekierowanie tymczasowe dopasuj jeśli potrzebijesz lub skasuj sekcję
## Redirect 302 /wp-content/duda.html /wp-content/uploads/wymiana-wkladu-w-dlugopisie.html
## Redirect 302 /mod_rewrite.html https://httpd.apache.org/docs/2.4/rewrite/intro.html
## włączamy moduł mod_rewrite
# RewriteEngine on
## ustawiamy główną ścieżkę do katalogu wordpressa
# RewriteBase /
############# Dyrektywy ##########################
## Directory do katalogów na dysku serwera #
## Files do konkretnego pliku na dysku serwera #
## Location odwołuje się do adresu internetowego #
##################################################
############
## blokady #
############
## blokujemy przeglądanie katalogów i wykonywanie skryptów CGI
# Options All -ExecCGI -Indexes
## alternatywnie do blokowanie wyświetlania używamy
## dla wszystkiego
# IndexIgnore *
## dla poszczególnych typów plików (resztę będzie widać) dodaj rozszeżenie które chesz ukryć
# IndexIgnore *.backup *.old
# IndexIgnore *.txt
## Pliki zabronione pod wordpressa
# <FilesMatch „wp-config*\.php|\.htaccess|\.htpasswd”>
# Order allow,deny
# Deny from all
# </FilesMatch>
# <Files xmlrpc.php>
# Order deny,allow
# Deny from all
# </Files>
# <Files install.php>
# Order deny,allow
# Deny from all
# </Files>
# <Files readme.txt>
# Order allow,deny
# Deny from all
# </Files>
## wyłączanie uruchamiania skryptów w katalogu uploadu
# <Directory „/sciezka/serwera/do/katalogu/wp-content/uploads”>
# AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi
# Options -ExecCGI
# </Directory>
## blokada listowanie plików wedle potrzeby (można skasować sekcję)
# <Files ~ „.(old|backup|log)$”>
# Order deny,allow
# Deny from all
# </Files>
## blokada listowania autorów
# RewriteCond %{QUERY_STRING} author=\d*
# RewriteRule .*$ /? [L,R=301]
## alternatywnie blokada (w roocie zamiast w katalogu) dostępu do zawartości katalogów wp-includes
# <IfModule mod_rewrite.c>
# RewriteRule ^wp-admin/includes/ – [F,L]
# RewriteRule !^wp-includes/ – [S=3]
# RewriteRule ^wp-includes/[^/]+\.php$ – [F,L]
# RewriteRule ^wp-includes/js/tinymce/langs/.+\.php – [F,L]
# RewriteRule ^wp-includes/theme-compat/ – [F,L]
# </IfModule>
## blokada dostępu do nieużywanych metod zapytań
# RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK|OPTIONS|HEAD) [NC]
# RewriteRule .* – [F]
#################
## odblokowanie #
#################
## dzięki „Satisfy any” umożliwiamy dostęp do plików w podkatalogu
# <FilesMatch „admin-ajax\.php|admin-post\.php”>
# Order allow,deny
# Allow from all
# Satisfy any
# </FilesMatch>
####################################################
## wymuszanie pobierania na podstawie rozszerzenia #
####################################################
## narzuca pobieranie plików zamiast wyświetlania
# <FilesMatch „\.(txt|pdf|PDF|docx|odf|xlsx)$” >
# ForceType application/octet-stream
# Header add Content-Disposition „attachment”
# </FilesMatch>
## narzuca pobieranie plików z całego katalogu „uploads” zamiast wyświetlania
# <IfModule mod_headers.c>
# <Location ~ „.*/uploads/.*”>
# Order allow,deny
# Allow from all
# </Location>
# </IfModule>
### przekierowanie z głównej na subdomenę www (można skasować)
## RewriteCond %{HTTP_HOST} !^$
## RewriteCond %{HTTP_HOST} !^www\.test\.vj\.pl$ [NC]
## RewriteRule ^/(.*)$ http://www.test.vj.pl/$1 [L,R=301]
### wymuszanie ssl (można skasować)
## RewriteCond %{SERVER_PORT} ^80$
## RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
####################
## zabawy z czasem #
####################
### w zależności od godziny podmienia serwowany plik (można skasować)
## RewriteCond „%{TIME_HOUR}%{TIME_MIN}” >0700
## RewriteCond „%{TIME_HOUR}%{TIME_MIN}” <1900
## RewriteRule „^style\.css$” „dzien.css” [L]
## RewriteRule „^style\.css$” „noc.css”
###############################################
## czasowa konserwacja, admin ma dostęp po IP #
###############################################
## musisz mieć plik przerwa-techniczna.html (można skasować)
# RewriteEngine on
# RewriteCond %{REQUEST_URI} !/przerwa-techniczna.html$
# RewriteCond %{REMOTE_ADDR} !^666\.666\.666\.666
# RewriteRule $ /przerwa-techniczna.html [R=302,L]
########################
## dodatkowe wycinanki #
########################
## blokada skryptów i SQLi poprzez URL-a
## skrypty wywołujące base64_encode w adresie
# RewriteCond %{QUERY_STRING} base64_encode[^(]*\([^)]*\) [OR]
## wywołania <script> w adresie
# RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR]
## wywołania zmiennych PHP GLOBALS w adresie
# RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
## modyfikowanie zmiennej _REQUEST poprzez adres
# RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2}) [OR]
## wyjscie katalog wyżej
# RewriteCond %{QUERY_STRING} \.\.\/ [NC,OR]
## rozszerzenia spoza www
# RewriteCond %{QUERY_STRING} ^.*\.(bash|git|hg|log|svn|swp|cvs) [NC,OR]
## ścieżka do plików serwera
# RewriteCond %{QUERY_STRING} etc/passwd [NC,OR]
# RewriteCond %{QUERY_STRING} boot\.ini [NC,OR]
## ucieczka z protokołu sieciowego, przejście na localhosta
# RewriteCond %{QUERY_STRING} ftp\: [NC,OR]
# RewriteCond %{QUERY_STRING} http\: [NC,OR]
# RewriteCond %{QUERY_STRING} https\: [NC,OR]
# RewriteCond %{QUERY_STRING} ^.*(127\.0).* [NC,OR]
## słowa „zastrzeżone” w URLu
# RewriteCond %{QUERY_STRING} ^.*(%24&x).* [NC,OR]
# RewriteCond %{QUERY_STRING} (menu|mod|path|tag)\=\.?/? [NC,OR]
# RewriteCond %{QUERY_STRING} ^.*(globals|encode|localhost|loopback).* [NC,OR]
# RewriteCond %{QUERY_STRING} ^.*(request|concat|insert|union|declare).* [NC,OR]
# RewriteCond %{QUERY_STRING} !^loggedout=true [NC,OR]
# RewriteCond %{QUERY_STRING} !^action=jetpack-sso [NC,OR]
# RewriteCond %{QUERY_STRING} !^action=rp
## powyższe RewriteCond powodują wywołanie przekierowania na 403 i pokazanie strony głównej
# RewriteRule .* index.php [F]
## wycinka hotlinkowania obrazków wstaw własną domenę (można skasować)
## uwaga blokuje również googla
# RewriteCond %{HTTP_REFERER} !^$
# RewriteCond %{HTTP_REFERER} !^http://(www\.)?vj.pl/.*$ [NC]
# RewriteRule \.(gif|jpg|swf|flv|png)$ http://vj.pl/domyslny-obrazek-blokady.jpg [R=302,L]
## wycinka komentarzy bez referera i z pustym opisem przeglądarki
# RewriteCond %{REQUEST_METHOD} POST
# RewriteCond %{REQUEST_URI} .wp-comments-post\.php*
# RewriteCond %{HTTP_REFERER} !.*test.vj.pl.* [OR]
# RewriteCond %{HTTP_USER_AGENT} ^$
# RewriteRule (.*) ^http://%{REMOTE_ADDR}/$ [R=301,L]
## blokada użytkowników przychodzących z niechcianych stron (można skasować)
## przez analogię dopisz niechciane źródłowe domeny/wyrazenia do zmiennej spam_ref
# SetEnvIfNoCase Referer „^http://(www.)?jakiś-refferer.com” spam_ref = 1
# SetEnvIfNoCase Referer „^http://(www.)?jakiś-site.com” spam_ref = 1
# SetEnvIfNoCase Referer „^wyrażenie-zawarte-w-address-url” spam_ref = 1
## wykonanie blokowania całego zestawu ze spam_ref
# <FilesMatch „(.*)”>
# Order Allow, Deny
# Allow from all
# Deny from env = spam_ref
# </ FilesMatch>
## rozważ wklejenie antybotowej paczki http://pastebin.com/BPRv4TDd
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ – [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
##################
## inne katalogi #
##################
## W katalogu wp-admin dodaj plik .htaccess o treści
## AuthType Basic
## AuthGroupFile /dev/null
## AuthName „Czego tu szukasz”
## AuthUserFile /sciezka-do-htpasswd/.htpasswd
## require valid-user
### <FilesMatch „admin-ajax\.php|admin-post\.php”>
### Order allow,deny
### Allow from all
### Satisfy any
### </FilesMatch>
### W katalogu wp-includes dodaj plik .htaccess o treści
### <FilesMatch „\.(?i:php)$”>
#### ?i: tryb http://www.gajdaw.pl/php/wyrazenia-regularne-pcre-php-tutorial/print.html#R22
### Order allow,deny
### Deny from all
### </FilesMatch>
### <Files wp-tinymce.php>
### Allow from all
### </Files>
### <Files ms-files.php>
### Allow from all
### </Files>
### W katalogu uploads dodaj plik .htaccess o treści
### <FilesMatch „\.(?i:php)$”>
### Order allow,deny
### Deny from all
### </FilesMatch>
##################
## prawa dostępu #
##################
## Standardowe uprawnienia .htaccess to 644 (rw- r– r–)
## zalecane Tryb tylko do odczytu .htaccess permissions to 444 (r– r– r–) (blokuje część wtyczek i zmiany ścieżek z poziomu administracji wordpressa)