Задать вопрос
am0rall
@am0rall
web-designer

Регулярные выражения htaccess, как выбрать конкретные директории и перенаправить с QSA?

Господа, помоги оптимизировать .htaccess таким образом, чтобы избежать дублирования RewriteRule для каждой из папок.

Я высылаю клиенту исходники вёрстки в виде ссылки на технический поддомен, в корне разрешен листинг файлов
Options +Indexes

Весь файл .htaccess
Options +Indexes
IndexOptions Charset=utf8
DirectoryIndex myindex.php

<IfModule mod_autoindex.c>
IndexOptions IgnoreCase FancyIndexing FoldersFirst NameWidth=* DescriptionWidth=* XHTML HTMLtable SuppressHTMLPreamble 
	HeaderName /myFolder/.dirlist_src/dirlist_HEADER.html
	ReadmeName /myFolder/.dirlist_src/dirlist_FOOTER.html
	IndexIgnore .htaccess .ftpquota .DS_Store *.php *.zip *.htaccess
</IfModule>

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_URI} ^/myFolder/(css|js|fonts|img)/(.*)$ [NC]
RewriteRule ^css(.+)$ /myFolder/.css$1  [QSA,L]
RewriteRule ^js(.+)$ /myFolder/.js$1  [QSA,L]
RewriteRule ^fonts(.+)$ /myFolder/.fonts$1  [QSA,L]
RewriteRule ^img(.+)$ /myFolder/.img$1  [QSA,L]
</IfModule>


Клиенту нечего отвлекаться на папки со шрифтами, картинками или стилями, посему, лишние папки я скрываю, добавляя к им имени точку, например /.css или /.js, таким образом, в листинге остаются только .html-файлы

Однако, если переименовать папки, то надо править и пути в файлах вёртски, а это геморрой, потому что файлов может быть сотня!

Поэтому, было решено устроить всем нужным файлам редирект, как я это понимаю:
при условии запроса урл /myFolder/{N}/ должна происходить подмена ссылки на /myFolder/{.2N} (с точкой);
правило «отрезает» часть ссылки с {N} и подставляет остаток к /myFolder/{.2N}, больше урл никак не дополняется и формируется с родительским запросом.

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_URI} ^/myFolder/(css|js|fonts|img)/(.*)$ [NC]
RewriteRule ^css(.+)$ /myFolder/.css$1  [QSA,L]
RewriteRule ^js(.+)$ /myFolder/.js$1  [QSA,L]
RewriteRule ^fonts(.+)$ /myFolder/.fonts$1  [QSA,L]
RewriteRule ^img(.+)$ /myFolder/.img$1  [QSA,L]
</IfModule>

Моя проблема заключается в том, что если для условия у меня получилось в одну строку записать все нужные для замены папки (css|js|fonts|img), то для директивы правила уже нет. Пришлось дублировать правило и для каждой папки указывать своё. К слову, это работает и с поставленной задачей справляется.

Но у меня есть стойкое ощущение, что это правило можно записать с использованием регулярных выражений. Да, оно усложнится для понимания, но зато кол-во строк уменьшится :)

Подскажите, пожалуйста, как это сделать?
  • Вопрос задан
  • 272 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
@dodo512
Можно не переименовывать, а просто добавить в IndexIgnore имена папок.
IndexIgnore .* *.php *.zip css js fonts img

Ну а если уж так охота делать на mod_rewrite.
RewriteEngine on
RewriteCond %{REQUEST_URI} ^/myFolder/(css|js|fonts|img)/(.*)$ [NC]
RewriteRule ^ /myFolder/.%1/%2  [QSA,L]
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы