Файл .htaccess має важливе значення в роботі всього інтернет-магазину, розглянемо його докладно, що ж він включає за замовчуванням. Тим більше, що "з коробки" він містить багато зайвого. Заодно пройдемося по основним директивам цього файлу. Файл має багато коментарів, я розписуватиму тільки працюючі рядки.
З коробки .htaccess в OpenCart має велику кількість марного коду. В першу чергу пройдемося по головним директивам та налаштуванням файлу. Стандартний .htaccess для opencart містить велику кількість пояснень , я буду розписувати тільки працюючі рядки.
Options +FollowSymlinks
Дозволяє віддавати файли, які фізично перебувають за межами root директорії, але які є ярлики (symbolic link). Потрібна робота mod_rewrite
Options –Indexes
Заборона видачі лістингу порожнього каталогу. У каталозі, в якому відсутній файл, що показується за замовчуванням (наприклад, index.html), не відображатиметься вміст зі списком файлів. Відвідувач отримає помилку HTTP 403 — access forbidden .
<FilesMatch "(?i)((\.tpl|.twig|\.ini|\.log|(?<!robots)\.txt))"> Require all denied </FilesMatch>
Заборона прямого доступу до файлів із зазначеними розширеннями, крім robots.txt. Тут же закоментовано повідомлення:
"Для apache 2.2 і старіше замініть "Require all denied" цими двома рядками:" # Order deny,allow # Deny from all Якщо у apache вас 2.4+ - залишаємо як є.
Можна замінити альтернативним типом запису.
<FilesMatch "\.(tpl|ini|log|txt)"> Order deny,allow Deny from all </FilesMatch> <Files robots.txt> Allow from all </Files>
Блок mod_rewrite
RewriteEngine On
Увімкнення модуля mod_rewrite для модифікації SEO URL.
RewriteBase /
Область перетворення. І тут весь магазин. Можна обмежити директорією, якщо ваш сайт інстальовано в директорії, наприклад: RewriteBase /shop
RewriteRule ^sitemap.xml$ index.php?route=extension/feed/google_sitemap [L]
Під час звернення до XML карти сайту на URL site.com/sitemap.xml перенаправляє на site.com/index.php?route=extension/feed/google_sitemap
Тобто, на динамічну карту сайту, яка генерується стандартним модулем OpenCart.
RewriteRule ^googlebase.xml$ index.php?route=extension/feed/google_base [L]
Передбачалося, що за посиланням site.com/googlebase.xml буде переадресація на site.com/index.php?route=extension/feed/google_base, тобто викликатиметься контролер з файлу catalog\controller\extension\feed\google_base.php Даний контролер мав працювати з базою даних Google, яка вже не є актуальною. Це правило можна видалити з .htaccess
RewriteRule ^system/download/(.*) index.php?route=error/not_found [L]RewriteRule ^system/storage/(.*) index.php?route=error/not_found [L]
При спробі отримати вміст папки system/download за посиланням site.com/system/download/… або site.com/system/download/… переадресовувати на site.com/index.php?route=error/not_found де викликається метод index контролера catalog \controller\errorot_found.php виводить повідомлення «сторінку не знайдено». У OpenCart 2.3 (може й у попередніх версіях) папки download в system немає, тому це правило можна видалити з .htaccess. До того ж, у папці system є свій файл .htaccess, що обмежує доступ до її вмісту.
Якщо попередні регулярні вирази з директив RewriteRule не підійшли, виконання йде далі.
RewriteCond %{REQUEST_FILENAME} !-fЯкщо файл, вказаний у запиті, не існує, тоді перевірка продовжується і може виконатися рядок з директивою RewriteRule. Якщо index.php є, то перевірка не пройшла, директива RewriteRule не виконається, а файл index.php в результаті і завантажиться з усіма get-параметрами (якщо є).
RewriteCond %{REQUEST_FILENAME} !-dЯкщо запитуваний каталог (папка) не існує
RewriteCond %{REQUEST_URI} !.*\.(ico|gif|jpg|jpeg|png|js|css)Якщо запитується не файл із одним із зазначених розширень
RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]
Тоді будь-який запит переадресовується на site.com/index.php?_route_[після параметра _route_ підставляється те, що вимагалося – будь-який рядок вказаний в URL після домену]
GET-параметри, за допомогою регулярного виразу, підставляються в рядку замість $1
Ця директива виконається, якщо URL не був вказаний файл index.php, що відбувається в т. ч. при включенні ЧПУ URL. У процесі завантаження програми перевіряється, чи було включено ЧПУ в налаштуваннях. Якщо ні, при отриманні параметра _route_ здійсниться виклик контролера 'common/home', який виведе домашню (головну) сторінку. Якщо ж ЧПУ було включено, виконується контролер ControllerStartupSeoPro з файлу catalog\controller\startup\seo_pro.php або інший вибраний, де параметр _route_ буде розібраний на частини та з таблиці бази даних url_alias за переданими в GET-запиті елементами знайдені аліаси, які вкажуть скрип шлях до контролера/методу, який необхідно викликати для виведення сторінки.
Далі йдуть додаткові параметри, які можуть знадобитися в специфічних ситуаціях.
Налаштування файлу .htaccess для OpenCart 2+ з коментарями:
# 1. Щоб використовувати URL Alias, вам потрібно запустити apache з увімкненим mod_rewrite.
# 2. У вашому каталозі opencart перейменуйте htaccess.txt в .htaccess.
# З будь-яких питань підтримки, будь ласка, відвідайте: https://www.opencart.com/
Options +FollowSymlinks
# Заборона видачі лістингу порожнього каталогу
Options -Indexes
# Заборонити прямий доступ до файлів
<FilesMatch "(?i)((\.tpl|.twig|\.ini|\.log|(?<!robots)\.txt))">
Require all denied
## Для apache 2.2 and older, replace "Вимагають всі потерпілого" з цими двома ліниями :
# Order deny,allow
# Deny from all
</FilesMatch>
# Налаштування SEO URL
RewriteEngine On
RewriteBase /
# Якщо ваша установка opencart встановлюється над головної директорії, переконайтеся, що у вашій папці вона працює, тобто. / becomes /shop/
# Редирект з www на ssl без www
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
# Редирект з ssl без www на ssl
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{QUERY_STRING} ^(.+)/$
RewriteRule ^(.*)/$ /$1/?%1 [R=301,L]
RewriteBase /
RewriteRule ^sitemap.xml$ index.php?route=extension/feed/google_sitemap [L]
RewriteRule ^googlebase.xml$ index.php?route=extension/feed/google_base [L]
RewriteRule ^system/storage/(.*) index.php?route=error/not_found [L]
RewriteRule ^system/download/(.*) index.php?route=error/not_found [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !.*\.(ico|gif|jpg|jpeg|png|js|css)
RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]
### Додаткові параметри, які можуть знадобитися для деяких серверів
### Розкоментуйте команди, видаливши знак # перед ним.
### Якщо ви отримали «Внутрішню помилку сервера 500» після включення будь-якої з налаштувань, відновіть #, оскільки це означає, що ваш хост не підтримує директиву.
# 1. Якщо ваш кошик дозволяє вам додавати тільки один елемент за раз, можливо register_globals включений. Ця директива допоможе його:
# php_flag register_globals off
# 2. Якщо у вашому кошику включені магічні лапки, це може допомогти вимкнути їх:
# php_flag magic_quotes_gpc Off
# 3. Встановіть максимальний розмір файлу, що завантажується. Більшість хостів обмежують це і не дозволяють перевизначити його, але ви можете спробувати
# php_value upload_max_filesize 999M
# 4. Встановіть максимальний розмір даних, що відправляються. Розкоментуйте цей рядок, якщо ви отримуєте помилки, коли форми не зберігають усі поля
# php_value post_max_size 999M
# 5. Встановіть, який максимальний час може зайняти сценарій. Розкоментуйте цей рядок, якщо у вас багато товарів або ви отримуєте помилки, коли форми не зберігають усі поля
# php_value max_execution_time 200
# 6. Встановіть максимальний час для введення. Розкоментуйте цей рядок, якщо у вас багато товарів або ви отримуєте помилки, коли форми не зберігають усі поля
# php_value max_input_time 200
# 7. Вимкнути обмеження open_basedir
# php_admin_value open_basedir none















































Коментарі