Проблема с .htacess: не могу настроить редирект

338
31 декабря 2016, 17:00

Добрый вечер. Друзья, помогите решить задачу: хочу переделать урлы следующего типа:

http://site.com/user?id=1

на урлы такого типа:

http://site.com/user/1

В HTACESS прописал такое:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^\ ]+)\?id
RewriteRule ^/?(.*)\?id$ /$1 [L,R=301]

Но не ничего не дает :( Помогите разобраться, заранее спасибо!

UP: Вот этим кодом

RewriteRule ^([a-zA-Z0-9-_]+)$ user.php?id=$1&%{QUERY_STRING} [NC,L]

Смог добиться того, что урл стал такого вида:

http://site.com/1

где "1" это id, которое успешно передается по $_GET['id'], но мне нужно сделать урл такой:

http://site.com/user/1

То есть дописать перед "1" еще user/ Помогите :)

Answer 1

Не дает потому что в документации по-английски написано:

...the Pattern is matched against only a partial path...

If you wish to match against the ... query string, use a RewriteCond with the ... %{QUERY_STRING} variables respectively

Перевожу на человеческий: Выражение сравнивается только с частью пути не затрагивая GET-параметры. Если вам очень нужно заменять именно вместе с параметрами запроса - придется использовать RewriteCond.

Однако в целом ваш случай пока не очень понимаю. Мне кажется что вы неправильно сформулировали для себя задачу.

На всякий случай могу предложить такое решение (ну вдруг и правда так надо)

RewriteCond ${QUERY_STRING} id=([^&]+)
RewriteRule ^user/?$ /user/%1

Эти строки будут искать запросы с GET-параметром id и переписывать их если запрос совпадает с user

Answer 2
RewriteRule ^(.*)$ /user?id=$1 [L]

прописываем user.php чтоб переходил на /user/blabla

RewriteCond %{QUERY_STRING} ^id=([0-9]*)$
RewriteRule ^user$ /user/%1? [L]

надеюсь что помог

Answer 3

Редирект (с RewriteCond знаком с чужих слов, так что с его синтаксисом мог накосячить, но за регулярки уверен):

RewriteCond ${QUERY_STRING} ^id=([1-9][0-9]*)(?:&([a-z\-_]+=[a-z0-9\-_]+))$
RewriteRule ^([a-z\-_]+)(?:\.php)$ $1/%1?%2 [L,NC,R=301]
RewriteCond ${QUERY_STRING} ^id=([1-9][0-9]*)$
RewriteRule ^([a-z\-_]+)(?:\.php)$ $1/%1 [L,NC,R=301]
RewriteRule ^([a-z\-_]+)(?:\.php)$ $1/ [L,NC,R=301]

Второй рерайт должен сработать, если иных параметров, кроме id не передано, а третий просто заменяет адреса вида user.php на user/, если они введёны без параметров.

Рерайт (что делает). Добавил параметр rewritten=1, чтобы запросы, посланные сервером, не попадали под редирект, иначе будет бесконечное перенаправление:

RewriteRule ^([a-z\-_]+)(?:(?:\/([1-9][0-9]*))?)$ $1.php?rewritten=1&id=$2&%{QUERY_STRING} [NC,L]
READ ALSO
Как поменять curl метод POST на GET?

Как поменять curl метод POST на GET?

Такова проблемка, есть сервис вида siteua/get_new

576
Как сделать из jsf Json?

Как сделать из jsf Json?

Всем Добрый вечер!

428
Не работает событие checked = false javascript [дубликат]

Не работает событие checked = false javascript [дубликат]

На данный вопрос уже ответили:

412
Получить данные из формы

Получить данные из формы

ЗдравствуйтеНа сайте есть кнопка, при нажатии на которую генерируется хэш, который мне нужно получить

395