--=REKLAMA=--

Plik htaccess w Joomla!

Z Joomla!WikiPL

Wersja Komodore (dyskusja | edycje) z dnia 02:01, 15 wrz 2021

(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)

Wstęp

Wiele osób nie wie, jak używać pliku .htaccess i zasypuje fora pytaniami, które zostały już wielokrotnie zadane i najczęściej zawierają rozwiązanie problemu. W związku z tym, poniżej zebrałem kilka informacji i tricków.

Korzystanie z pliku .htaccess jest opcją i zależy od serwera (tylko serwery Apache i tylko takie, na których możliwość korzystania z .htaccess dopuszcza usługodawca). Plik konfiguracyjny nie musi nazywać się .htaccess. Jest to domyślna nazwa, którą administrator serwera może zmienić, dlatego - zanim przemianuje się nazwę pliku htaccess.txt - należy się dowiedzieć w swojej firmie hostingowej, jak powinien się on nazywać.

Joomla! wykorzystuje plik .htaccess przede wszystkim do translacji adresów internetowych na czytelniejsze. Ponadto plik .htaccess wykorzystywany jest do ochrony zasobów witryny przed potencjalnymi zagrożeniami.

Budowa pliku

Nagłówek informacyjny:

##
# The line just below this section: 'Options +FollowSymLinks' may cause problems
#
# @package    Joomla
# @copyright  Copyright (C) 2005 - 2015 Open Source Matters. All rights reserved.
# @license    GNU General Public License version 2 or later; see LICENSE.txt
##

##
# READ THIS COMPLETELY IF YOU CHOOSE TO USE THIS FILE!
# with some server configurations.  It is required for use of mod_rewrite, but may already
# be set by your server administrator in a way that disallows changing it in
# your .htaccess file.  If using it causes your server to error out, comment it out (add # to
# beginning of line), reload your site in your browser and test your sef url's.  If they work,
# it has been set by your server administrator and you do not need it set here.
##


Od wersji 3.4.0 dodano wykluczenie z listowania całej zawartości wszystkich folderów

## No directory listings
IndexIgnore *

Od wersji 3.7.0 dodano kontrolę aktywności modułu autoindex

## No directory listings
<IfModule autoindex>
  IndexIgnore *
</IfModule>

a od wersji 3.9.22 zmieniono autoindex na mod_autoindex.c

## No directory listings
<IfModule mod_autoindex.c>


Od wersji 3.9.3 dodano blok

## Suppress mime type detection in browsers for unknown types
<IfModule mod_headers.c>
Header always set X-Content-Type-Options "nosniff"
</IfModule>

Jednak zdarza się, że powoduje on problemy w wyświetlaniu w MSIE11. Wówczas trzeba go zakomentować.

Od wersji 3.9.27 powyższy blok zostaje uzupełniony o nową dyrektywę

## Suppress mime type detection in browsers for unknown types
<IfModule mod_headers.c>
Header always set X-Content-Type-Options "nosniff"
##
# Disable Federated Learning of Cohorts (FLoC)
# If you uncomment the below directive you have to allow this technology in the 
# Global Configuration of Joomla. Read more about this in the Post-Installation 
# message in the backend.
##
# Header always set Permissions-Policy "interest-cohort=()"
</IfModule>


Włączenie połączeń symbolicznych (skrótów do plików traktowanych jako pliki fizyczne). W oryginalnym pliku jest tak:

## Can be commented out if causes errors, see notes above.
Options +FollowSymLinks

ale na niektórych serwerach jednak nie działa, lub trzeba zmienić, jeśli chce się z nich korzystać, na:

Options +SymLinksIfOwnerMatch


Od wersji 3.4.0 dodano

Options -Indexes

Od wersji 3.9.21 dodano blok

## Disable inline JavaScript when directly opening SVG files or embedding them with the object-tag
<FilesMatch "\.svg$">
  <IfModule mod_headers.c>
    Header always set Content-Security-Policy "script-src 'none'"
  </IfModule>
</FilesMatch>


Tutaj zaczyna się blok przekierowań:

## Mod_rewrite in use.

RewriteEngine On

W tej części znajdują się dyrektywy blokujące niektóre exploity, próbujące dobrać się do Joomla!:

## Begin - Rewrite rules to block out some common exploits.
 If you experience problems on your site block out the operations listed below
 This attempts to block the most common type of exploit `attempts` to Joomla!

Joomla 1.5 Poniższy fragment występuje tylko w Joomla!1.5:

## Deny access to extension xml files (uncomment out to activate)
#<Files ~ "\.xml$">
#Order allow,deny
#Deny from all
#Satisfy all
#</Files>
## End of deny access to extension xml files
# Block out any script trying to set a mosConfig value through the URL
RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|\%3D) [OR]

I dalej dla wszystkich wersji Joomla!:

# Block out any script trying to base64_encode data within the URL.
RewriteCond %{QUERY_STRING} base64_encode[^(]*\([^)]*\) [OR]
# Block out any script that includes a <script> tag in URL.
RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR]
# Block out any script trying to set a PHP GLOBALS variable via URL.
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
# Block out any script trying to modify a _REQUEST variable via URL.
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
# Return 403 Forbidden header and show the content of the root homepage
RewriteRule .* index.php [F]
#
## End - Rewrite rules to block out some common exploits.


Teraz następuje sekcja, w której użytkownicy mogą umieścić swoje przekierowania:

## Begin - Custom redirects
#
# If you need to redirect some pages, or set a canonical non-www to
# www redirect (or vice versa), place that code here. Ensure those
# redirects use the correct RewriteRule syntax and the [R=301,L] flags.
#
## End - Custom redirects


Następny blok ustawia ścieżkę do folderu, w którym znajduje się Joomla!. W większości przypadków nie trzeba tego ustawiać.

##
# Uncomment following line if your webserver's URL
# is not directly related to physical file paths.
# Update Your Joomla! Directory (just / for root).
##

# RewriteBase /


Ostatni blok jest wykorzystywany do przekierowania nieporządanych zapytań do systemu Joomla

## Begin - Joomla! core SEF Section.
#
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
#
# If the requested path and file is not /index.php and the request
# has not already been internally rewritten to the index.php script
RewriteCond %{REQUEST_URI} !^/index\.php


Od wersji 3.4.0 usunięto poniższy fragment

# and the request is for something within the component folder,
# or for the site root, or for an extensionless URL, or the
# requested URL ends with one of the listed extensions
RewriteCond %{REQUEST_URI} /component/|(/[^.]*|\.(php|html?|feed|pdf|vcf|raw))$ [NC]


i dalsza część pliku bez zmian

# and the requested path and file doesn't directly match a physical file
RewriteCond %{REQUEST_FILENAME} !-f
# and the requested path and file doesn't directly match a physical folder
RewriteCond %{REQUEST_FILENAME} !-d
# internally rewrite the request to the index.php script
RewriteRule .* index.php [L]
#
## End - Joomla! core SEF Section.

Dodatkowe wpisy do sekcji użytkownika

Domena z www

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^.*$ http://www\.%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 

Domena bez www

RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^.*$ http://%1%{REQUEST_URI} [R=301,L]

XMAP i sitemap.xml

Trzeba pamiętać, aby ustawić odpowiedni id (ostatni parametr) mapy, która będzie używana.

RewriteCond %{REQUEST_URI} ^/?sitemap\.xml$ [NC]
RewriteRule ^.+$ "http://domena/index.php?option=com_xmap&view=xml&tmpl=component&id=1" [R=301,L]

Zmiana protokołu https na http

RewriteCond %{SERVER_PORT} ^443$  [OR]
RewriteCond %{HTTPS} on
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301,L]

Wyłączenie odwołań do folderów domen i subdomen

Niektóre serwery przypisują domenę od razu do folderu public_html, ale jeśli jest możliwość konfigurowania wielu domen i subdomen, to można je podpiąć do poszczegółnych folderów w folderze domeny głównej i za pomocą przekierowań zabezpieczyć domenę główną przed odwołaniami do folderów z podpiętymi domenami lub subdomenami.

Przykładowe drzewo folderów:

  • folderDomeny1
    • folderDomeny2
    • folderSubdomeny1

Niepożądane odwołania w domena1

  • domena1/folderDomeny2/
  • domena1/folderSubdomeny1/

zostaną przekierowane na

  • domena2
  • subdomena1.domenaGłówna

jeśli w pliku .htaccess w folderDomeny1 zostaną dodane wpisy:

 RewriteCond %{HTTP_HOST} ^domena1$ [NC]
 RewriteCond %{REQUEST_URI} ^/?folderSubdomeny1/(.*) [NC]
 RewriteRule ^.*$ "http://subdomena1.domenaGłówna/%1" [R=302,L]

 RewriteCond %{HTTP_HOST} ^domena1$ [NC]
 RewriteCond %{REQUEST_URI} ^/?folderDomeny2/(.*) [NC]
 RewriteRule ^.*$ "http://domena2/%1" [R=302,L]

Dodatkowe informacje:


Dziękujemy za wkład

» Adam Przybylski [komodore],