mod_Rewrite из статики на cgi

vga1
На сайте с 18.02.2007
Offline
251
501

Добрый день!

Кто силен в mod_Rewrite?

Сейчас настройки для перенаправления всех запросов всего в директорию directory1 со структурой сайта.

RewriteCond %{REQUEST_URI} !^/site.com/

RewriteCond %{HTTP_HOST} ^(www.)?site.com$

RewriteRule ^(.*)$ directory1/$1 [L]

Нужно, чтобы статические страницы вида

www.site.com/dir1/file1.html

перенаправлялись на

www.site.com/?cat=dir1&name=file1

www.site.com/dir2/file1.html

перенаправлялись на

www.site.com/?cat=dir2&name=file1

а если не попадает под этот шаблон, то работал старый код

RewriteRule ^(.*)$ directory1/$1 [L]

Гуглил, пробовал, но у меня есть подозрение, что есть некая особенность, что сайт находится в поддиректории directory1, поэтому у меня возникают проблемы.

gormarket
На сайте с 29.12.2010
Offline
47
#1

У Вас разный контент для сайте для адресов с www и без www ?

Этот вопрос возникает после приведенной Вами конструкции

RewriteCond %{REQUEST_URI} !^/site.com/

RewriteCond %{HTTP_HOST} ^(www.)?site.com$

RewriteRule ^(.*)$ directory1/$1 [L]

Если контент одинаковый, то первые две строки из приведенной конструкции можно удалить, они лишние.

(подобные проверки делаются для редиректов с целью оставить только один адрес домена - без www)

Товары и цены в магазинах Вашего города: Городской рынок (http://gormarket.ru/)
vga1
На сайте с 18.02.2007
Offline
251
#2
gormarket:
У Вас разный контент для сайте для адресов с www и без www ?

Одинаковый, спасибо за совет, попробую!

gormarket
На сайте с 29.12.2010
Offline
47
#3

Значит просто эти две строки остались от образца, по которому делали этот реврайт

А по поводу перенаправления статических страниц, то где-то так

RewriteCond %{REQUEST_URI} ^/(dir1|dir2)/([^./]+)\.html$

RewriteRule .* http://%{HTTP_HOST}/?cat=%1&name=%2 [L]

Это если у вас всего две перечисленные директории dir1 и dir2 (можно их заменить другими, реальными именами)

А для любых директорий можно сделать более универсально

RewriteCond %{REQUEST_URI} ^/([^./]+)/([^./]+)\.html$

RewriteRule .* http://%{HTTP_HOST}/?cat=%1&name=%2 [L]

Если у Вас не получалось, то проблема не в том что сайт в поддиректории, а в том что после применения правил реврайтов в htaccess (если новый адрес находится в "юрисдикции" того же htaccess) происходит новый вход в тот же файл и могут произойти новые реврайты из него, и так до тех пор пока после прохода по файлу преобразований не произойдет, либо после преобразования новый адрес не будет в "юрисдикции" данного htaccess

Чтоб этого избежать нужно применять дополнительные "хитрости" (одного флага [L] не хватает, он останавливает преобразования только текущего прохода по файлу htaccess)

---------- Добавлено 18.01.2013 в 15:17 ----------

Чтоб не было вмешательства других реврайтов попробуйте сразу после имеющихся строк

RewriteEngine On

RewriteBase /

(до любых других реврайтов) добавить такой код

RewriteCond %{ENV:REDIRECT_RVR} ^yes$

RewriteRule .* - [L]

RewriteCond %{REQUEST_URI} ^/([^/]+)/([^/]+)\.html$

RewriteRule .* http://%{HTTP_HOST}/?cat=%1&name=%2 [L,E=RVR:yes]

vga1
На сайте с 18.02.2007
Offline
251
#4
gormarket:
У Вас разный контент для сайте для адресов с www и без www ?
Если контент одинаковый, то первые две строки из приведенной конструкции можно удалить, они лишние.
(подобные проверки делаются для редиректов с целью оставить только один адрес домена - без www)

Попробовал убрать через www интерфейс, на час уложил хостинг, пока комп с нормальным доступом искал 😂

На аккаунте много сайтов, получается убрав эти две строчки - применил последнее условие ко всем сайтам.... вообщем все стали недоступны.

Дальше буду пробовать уже при полном доступе к хостингу. Заморочки с этим godaddy

gormarket
На сайте с 29.12.2010
Offline
47
#5

Если доменов много адресуется на папку с данным файлом htaccess, то конечно же перед правилом в этом файле, касающимся только одного домена, нужно ставить проверку

RewriteCond %{HTTP_HOST} ^(www\.)?site\.com$

Так же и для реврайтов страниц вида

www.site.com/dir1/file1.html

если реврайты нужны только для конкретного домена site.com, нужно добавлять такую проверку:

RewriteCond %{HTTP_HOST} ^(www\.)?site\.com$

RewriteCond %{REQUEST_URI} ^/([^/]+)/([^/]+)\.html$

RewriteRule .* http://%{HTTP_HOST}/?cat=%1&name=%2 [L,E=RVR:yes]

vga1
На сайте с 18.02.2007
Offline
251
#6

Благодарю за исчерпывающий ответ, получилось!

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий