Настройка правильного файла htaccess в Opencart

Файл .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\error\not_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
## For apache 2.2 and older, replace "Require all denied" with these two lines :
# 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


Комментарии

Написать комментарий