Вопрос по RewriteRule в файле .htaccess

T
На сайте с 25.03.2011
Offline
121
1595

Превращаю динамику в статику таким образом:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^([a-z0-9]+) index.php?page=$1

Здесь учтен файл index.phр.

А как сделать, чтобы одновременно и другие преобразовывались (news.php, about.php и т.д)?

Запись такого рода не помогает:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^([a-z0-9]+) index.php?page=$1

RewriteRule ^([a-z0-9]+) news.php?page=$1

Как нужно правильно изменить(добавить)?

Благодарю за помощь!

DiAksID
На сайте с 02.08.2008
Offline
236
#1
Toker:
Превращаю динамику в статику таким образом:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-z0-9]+) index.php?page=$1

Здесь учтен файл index.phр.
А как сделать, чтобы одновременно и другие преобразовывались (news.php, about.php и т.д)?

Запись такого рода не помогает:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-z0-9]+) index.php?page=$1
RewriteRule ^([a-z0-9]+) news.php?page=$1

Как нужно правильно изменить(добавить)?

Благодарю за помощь!

1. например: RewriteRule ^([a-z0-9]+) news.php?page=$1 -редиректит только адреса начинающиеся с алфавитно-цифрового названия и БЕЗ СУФФИКСА Regex

2. даже если п. 1 верен второй редирект на news.php?page=$1 не сработает как Вы ожидаете (он сработает как чистый RewriteRule), потому как до него по условию УЖЕ ВСЕ несуществующие адреса редиректнулись на index.php?page=$1. т .е.: если два редиректа - должно быть два условия.

делите условие на два (видимо, добавив к первому какое-нибудь RewriteCond %{REQUEST_URI}) и к каждому по редиректу

show must go on !!!...
T
На сайте с 25.03.2011
Offline
121
#2
DiAksID:
1. например: RewriteRule ^([a-z0-9]+) news.php?page=$1 -редиректит только адреса начинающиеся с алфавитно-цифрового названия и БЕЗ СУФФИКСА Regex

2. даже если п. 1 верен второй редирект на news.php?page=$1 не сработает как Вы ожидаете (он сработает как чистый RewriteRule), потому как до него по условию УЖЕ ВСЕ несуществующие адреса редиректнулись на index.php?page=$1. т .е.: если два редиректа - должно быть два условия.

делите условие на два (видимо, добавив к первому какое-нибудь RewriteCond %{REQUEST_URI}) и к каждому по редиректу

Если можете, запишите на примере как разделить и добавить? Новичку, как я, это сразу не дается.

DiAksID
На сайте с 02.08.2008
Offline
236
#3
Toker:
Если можете, запишите на примере как разделить и добавить? Новичку, как я, это сразу не дается.

да просто всё, для ваших двух редиректов типо этого:


# условие для несуществующих с с учётом маски адреса - редирект на index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} какая_то_регулярка_для_выборки_по_адресу
RewriteRule ^([a-z0-9]+) index.php?page=$1 [L]

# для всех несуществующих, которые не подошли под предыдущее условие - редирект на news.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-z0-9]+) news.php?page=$1 [L]

может удобнее наоборот - сначала выделить пачку на news.php, остальные на index.php, не суть, принцип простой.

по умолчанию условия объеденяются по "и". если нужно "или" добавляете [OR] к условию которое первое в "или". если в регулярке нужна регистронезависимость добавляете [NC].

[L] - продолжать

T
На сайте с 25.03.2011
Offline
121
#4

Не понял как заполнить эту строку:

RewriteCond %{REQUEST_URI} какая_то_регулярка_для_выборки_по_адресу

А без этой строки работает только первый скрипт.

DiAksID
На сайте с 02.08.2008
Offline
236
#5
Toker:
Не понял как заполнить эту строку:
RewriteCond %{REQUEST_URI} какая_то_регулярка_для_выборки_по_адресу

А без этой строки работает только первый скрипт.

вы хотите часть адресов редиректить на index, часть на news? по какому признаку будете определять? самое очевидное - по какой то особенности входящего адреса. вот эту "особенность" адреса для редиректа и определяете регуляркой "какая_то_регулярка_для_выборки_по_адресу". файлы попавшие под маску пойдут на текущий редирект, не попавшие пойдут на следующий.

ЗЫ: по уму если, то "какая_то_регулярка_для_выборки_по_адресу" лучше бы совместить с ^([a-z0-9]+) в RewriteRule. зачем два раза контролить адреса? должно хватить одного по идее. тогда будет поизящнее и по понятнее:


# условие для всех несуществующих
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# выборка по регулярке для адреса с учётом ^([a-z0-9]+)
RewriteRule регулярка index.php?page=$1 [L]

# условие для всех несуществующих
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# выборка по ^([a-z0-9]+)
RewriteRule ^([a-z0-9]+) news.php?page=$1 [L]

но запросто может сложится ситуация, что одним выражением выборку не сделать и "лишний(ие)" RewriteCond всё равно придётся вставить...

T
На сайте с 25.03.2011
Offline
121
#6

Отличие в том, что хочу получить:

http://site.ru/1... - для index

http://site.ru/news/1.... - для news

Файлы index.php и news.php находятся в одной папке www на сервере.

DiAksID
На сайте с 02.08.2008
Offline
236
#7
Toker:
Отличие в том, что хочу получить:
http://site.ru/1... - для index
http://site.ru/news/1.... - для news

Файлы index.php и news.php находятся в одной папке www на сервере.

шиит, похоже Вы себя хорошо запутали 😂 исходя из последнего похоже на следующее:


RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-z0-9]+)$ index.php?page=$1 [L]
#
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^news/([a-z0-9]+)$ news.php?page=$1 [L]

(!) подумайте о ([a-z0-9]+) - подозрительно выглядит. где там слеш в перечислении и/или где суффиксы у адресов? ЧПУ работает слегка нестандартно? похоже что то/как то/с чем то не сходится в постановке "задачи". но если всё ок, то и зацикливать не будет и блоки условий можно как угодно расставлять, но это странное будет ЧПУ ;) хотя и без криминала...

T
На сайте с 25.03.2011
Offline
121
#8

Какой самое оптимальное решение будет в моем случае, какой код?

Последний код действительно не подходит. Оно вроде бы работает, но при news/ картинки теряются, с адресацией в папку images/ проблема.

DiAksID
На сайте с 02.08.2008
Offline
236
#9
Toker:
Какой самое оптимальное решение будет в моем случае, какой код?

Последний код действительно не подходит. Оно вроде бы работает, но при news/ картинки теряются, с адресацией в папку images/ проблема.

для нормального решения надо ЧПУ смотреть, на вскидку не получится. сами не сможете - зовите спеца по вашей CMS. но имхо: стоит один раз разобраться с mod_rewrite самому до конца, ну совсем там не сложно на самом деле...

T
На сайте с 25.03.2011
Offline
121
#10

Последний код работает, просто нужно было ссылки нормально вписать (img src="/....) со слэшом.

И потом я чуть модернизировал код:

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^([a-zA-Z0-9_-]+)$ index.php?page=$1 [L]

RewriteRule ^([a-zA-Z0-9_-]+)/$ index.php?page=$1 [L]

#

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^news/([a-z0-9]+)$ news.php?id=$1 [L]

RewriteRule ^news/([a-z0-9]+)/$ news.php?id=$1 [L]

Может еще необходимо что-то добавить...

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