WordPress

.htaccess do wordpressa

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)

 

 

Standard