WordPress

Jak robić backup WordPressa

Na WordCamp Lublin 2017 miałem przyjemność wygłosić prezentację pod tytułem „Całkiem przyzwoity backup”.

W prezentacji tej przedstawiam solidne podstawy jak powinien być przeprowadzany poprawnie backup i na co zwrócić uwagę przy wykonywaniu kopii zapasowej. Nacisk położyłem na bezpieczeństwo backupów, zachowanie ich integralności i poufności. Część prezentacji zajmuje przedstawienie cyklicznego testowania, czyli przeprowadzanie procesu odtwarzania backupu w kontrolowanych warunkach. Bez testów przywracania backupu nie mamy pewności czy kopia zapasowa wykonuje się poprawnie.

https://www.slideshare.net/bibliotekarz/calkiem-niezly-backup

Standard
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
Gdzie są umiejscowione polskie wordpressy
WordPress

Jaki hosting dla wordpressa?

Na WordUp Warszawa #prawielato miałem przyjemność wygłosić prelekcję o hostingach na których polska społeczność WordPressa trzyma swoje zasoby.

Prezentacja ta powstała na bazie ankiety „Gdzie są umiejscowione polskie wordpressy” przeprowadzonej w lutym 2015 roku wśród uczestników grup WordPress PL i WordPress Polska na facebooku. Pokazuje ona które hostingi są wykorzystywane pod wordpressa przez społeczność, oraz wskazujące na trzy najgorsze hostingi według uczestników ankiety.

 

 

Standard
WordPress

Czym się różni wpis od strony w Wordpresie?

Strona” to coś stałego jak dokument, natomiast „Wpis” przyrównuję od kartki z zapiskami w kalendarzu.

Moim Klientom zawsze proponuję aby:

Informacje przyrostowe, nietrwałe i często zmieniające się zamieszczali jako „Wpisy”. Przykład: wiadomości z życia firmy, komunikaty, nowości, relacje z targów/konferencji…

Informacje zasadnicze, nieprzyrastające w czasie  umieszczali jako „Strony”. Przykład: dane kontaktowe, statut, wyciąg z KRS, misja firmy, bilans, lista pozyskanych nagród…

Oczywiście należy edytować treść „Stron” żeby zawartość była aktualna, ale czyni się to raczej sporadycznie.

Dokładniejszy opis jak utworzyć stronę i jak utworzyć wpis, pojawią się za jakiś czas. Poniżej opisuję tylko unikalne cechy tych rozwiązań.

Główne różnice między stroną a wpisem:

Strony mają Czytaj dalej

Standard
WordPress

Edycja wpisu w WordPress WordUp wiosna 2015

To jest post szkoleniowy demonstrujący możliwości jakie daje domyślny edytora WordPress.

Główna różnica między trybem wizualnym a trybem tekstowym edytora wordpress.

Tryb wizualny pokazuje treść html
zmieniając nawiasy trójkątne na encje
to znaczy z < robi &lt; , oraz z > robi &gt;
tryb tekstowy interpretuje html

„tu się kończy zajawka czytaj dalej jeśli chcesz »”

Standard