htaccess, маленький вопрос

12
GoRSS
На сайте с 29.07.2013
Offline
138
1240

1. Имеется урл вида place.php?place_id=2

2. Для переезда на ЧПУ в адресе дописывается переменная вида &placesef=sochi

3. Далее нужно отрезать всё, оставив значение этой переменной, получив на выходе /sochi/

Вот так

RewriteRule ^([-a-zA-Z0-9_]+)/$ place.php?place_id=2&placesef=$1 [QSA,L]

или вот так

RewriteRule ^([-a-zA-Z0-9_]+)/([-a-zA-Z0-9_]+)/$ place.php?place_id=$1&placesef=$2 [QSA,L]
работает. Но в первом случае не годится, т.к. идентификаторы place_id разные, а во втором получается вида /2/sochi/, что тоже не хорошо.

Как в этой регулярке отрезать параметр place_id?

RewriteRule ^([-a-zA-Z0-9_]+)/$ place.php?place_id=(ЛЮБОЕ ЧИСЛО, этот параметр отбросить)&placesef=$1 [QSA,L]

https://commersoft.ru - софт: Google Indexing [индексация в Гугле по API] - Webcontrol [мониторинг сайтов и доменов]
IW
На сайте с 16.12.2014
Offline
73
#1

или я чего-то не понял, или зачем вам вообще place_id? вы же сами его выкинули из адреса? &placesef=sochi в /sochi/ у вас движек преобразовывает, вам надо получить из адресной строки /sochi/ обратно в Get параметр placesef=sochi, и уже этот параметр движек использует для вывода контента какого-то...

те в хакцесс строка

RewriteRule ^([-a-zA-Z0-9_]+)/$ place.php?placesef=$1 [NC]

и почему [QSA,L]?

SSD VPS скидка 25% по купону iwork https://cp.inferno.name/cart.php?gid=23 | надежный хостинг http://bit.ly/2Yiq93h
GoRSS
На сайте с 29.07.2013
Offline
138
#2

Вот тут расписал алгоритм http://phpforum.su/index.php?showtopic=84444&hl=# , проблема тоже решена вот так

RewriteRule ^([-a-zA-Z0-9_]+)/$ place.php?placesef=$1&place_id=(.) [QSA,L]
но пока не знаю, не слышал критики, может не правильно.

Отвечаю на ваш вопрос:

1. Весь код написан мной, place_id содержит идентификатор нужного курорта, всё крутится вокруг него. Переписывать не вариант, полжизни уйдет, кода слишком много. Игнорировать мне нужно лишь для генерации адреса, а сама переменная должна сохраняться, иначе, как написал выше, сайт рухнет.

2. [QSA,L] - значение флага L не знаю, он во всех примерах. А вот QSA нужен мне для микса в урле, чтобы можно было дописывать параметры. Например, был урл place.php?place_id=2, стал /sochi/ . И так как работа по переходу к ЧПУ-урлам длительная, для постепенного хода указан флаг QSA, чтобы можно было делать такого вида /sochi/?articles=1&art=12.

siv1987
На сайте с 02.04.2009
Offline
427
#3
GoRSS:
Как в этой регулярке отрезать параметр place_id?
RewriteRule ^([-a-zA-Z0-9_]+)/$ place.php?place_id=(ЛЮБОЕ ЧИСЛО, этот параметр отбросить)&placesef=$1 [QSA,L]

RewriteRule ^([\w-]+)/$ place.php?placesef=$1 [QSA,L]

GoRSS:
place_id=(.)

place_id=(.)(.)

GoRSS
На сайте с 29.07.2013
Offline
138
#4
siv1987:
RewriteRule ^([\w]+)/$ place.php?placesef=$1 [QSA,L]

Не, не то. Но уже сделал.

siv1987:
place_id=(.)(.)

у меня вирус порнухи вылез, сиськи во весь экран. Вы хакер?

siv1987
На сайте с 02.04.2009
Offline
427
#5
GoRSS:
Не, не то. Но уже сделал.

Чем именно не то?

GoRSS:
Но уже сделал.

Я видел что вы сделали, поэтому и написал.

GoRSS:
у меня вирус порнухи вылез, сиськи во весь экран. Вы хакер?

Так разве не лучше выглядит? В substitution нет регулярных выражений, и оттуда если что-то нужно вырезать то это удаляется из текста.

GoRSS
На сайте с 29.07.2013
Offline
138
#6

Так было бы лучше лет 10 назад)) substitution это правая сторона условия?

Урл: place.php?place_id=2&placesef=sochi . В новых урлах мне нужно видеть в адресной строке только значение переменной placesef для красоты, но при этом сохранять переменную place_id, т.к. все запросы исходя из ID, которое place_id и обозначает.

Типа один пишем, два в уме. Значение одной переменной в адресе, но вторую держим в памяти дабы обращаться к базе с её (второй) значением. Выкинуть мне её нужно было чтобы урл не получался вида /2sochi/ или /2/sochi , т.е. не показывая id.

siv1987
На сайте с 02.04.2009
Offline
427
#7

Не "показывать ид" при этом "сохранить ид" который еще и является динамичным, через htaccess не сделать. Либо один статический ид; либо ид берется из адреса запроса; либо никакого ид нет (что собственно выше и есть в реврайте - ибо вам ид в чпу не нужен). А то, как у вас "решена" проблема (прописан параметр place_id=(.)) ничем не отличается от того варианта что я привел, кроме отсутствия бессмысленного в данном случае параметра place_id с какой-то хренотенью в качестве значения.

IL
На сайте с 20.04.2007
Offline
435
#8

Одним .htaccess-ом задача не решается.

Если точнее, "прямая" - распознавание "движкового" адреса по ЧПУ потенциально решается большим .htaccess-ом (по 1 строчке на каждую страничку). Но лучше сделать соответствие "URL-id-шник" и разбирать его либо в движке, либо в "прокладке" (до того, как запрос будет обработан "движком" сайта).

А "обратная" (генерация ЧПУ по "движковому" адресу) - нет. Ну т.е. ссылки придётся переделывать вручную.. (а если ссылки, например, в меню или в листинге генерируются автоматически)...

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
GoRSS
На сайте с 29.07.2013
Offline
138
#9

ivan-lev, я вас не понял. Каждый урл писать в .htaccess не варик, страниц over 10k. Да и новые как, тоже постоянно писать? Плохо. Тянется переменная с названием категории, дальше по ней идет запрос в базу.

siv1987, вы прав. Но всё же переменная place_id остается до полной переиндексации. Вопрос #2:

как из этого

RewriteRule ^([-a-zA-Z0-9_]+)/$ place.php?place_id=2&placesef=$1 [QSA,L]
сделать редирект наоборот? С адресов place.php?place_id=2&placesef=$1 на ^([-a-zA-Z0-9_]+)/$, желательно посредством htaccess
siv1987
На сайте с 02.04.2009
Offline
427
#10

Добавить после RewriteEngine On

RewriteCond %{ENV:REDIRECT_STATUS} ^$

RewriteCond %{QUERY_STRING} ^place_id=\d+&placesef=(.*?)(?:&|$)

RewriteRule ^place\.php /%1/? [R=301,L]

12

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