mod_rewrite - перенаправить с одного домена на другой и сохранить конечные значения в URL

Я думаю, что это довольно прямой вопрос в mod_rewrite:

У меня есть один домен, который нужно перенаправить на другой, но сохранить любое значение после последней косой черты (/) в первом URL-адресе до второго.

domain.com/4433 следует перенести на domain.com/folder/?p=4333

Перечислено для ясности:

От: domain.com/4433

Кому: domain.com/folder/?p=4333

Любые идеи?

Изменить. Проведя некоторое тестирование, мы нашли следующее решение:

RewriteCond %{HTTP_HOST} ^domain.com$

Правило перезаписи ^([0-9a-z]*)$ /folder/?p=$1 [NC]

искренне, - баккелун


person Coreus    schedule 17.08.2009    source источник
comment
Вы хотите иметь HTTP-перенаправление или сервер делает это в фоновом режиме, не замечая пользователя?   -  person B.E.    schedule 17.08.2009
comment
это должно быть сделано так, чтобы пользователь не заметил. Но мы нашли решение, оно было таким: RewriteCond %{HTTP_HOST} ^domain.com$ RewriteRule ^([0-9a-z]*)$ /folder/?p=$1 [NC]   -  person Coreus    schedule 19.08.2009


Ответы (4)


Если вы действительно не хотите перенаправлять, но хотите иметь красивые URL-адреса, вы можете использовать

RewriteEngine On
RewriteRule ^/(.+)$ /folder?p=$1 [L]

Это берет все после первой косой черты и вставляет ее в $ 1, но только если после косой черты что-то есть. Он не выполняет перенаправление, поэтому пользователи этого не заметят.

person B.E.    schedule 17.08.2009

Без какой-либо дополнительной информации попробуйте следующее:

RewriteEngine on
RewriteRule ^/([^/]+)$ /folder/?p=$1

Если вы хотите использовать правило в файле .htaccess, удалите начальные косые черты.

person Gumbo    schedule 17.08.2009

На всякий случай: domain.com = domain1.com и domain2.com? domain1.com должен быть перенаправлен на domain2.com? Оба работают на одном сервере (необязательно)?

[ИЗМЕНИТЬ:]

Если вы действительно хотите сделать то, что указано в комментарии, сделайте следующее:

RewriteEngine On

RewriteCond %{HTTP_HOST} ^domain1.com$
RewriteRule ^4433$ http://domain2.com/folder/?p=4433 [R=301,L]

В противном случае, как сказал Бенедикт Эгер, или с R = 301, если вы хотите реального перенаправления. Или, если вы хотите, чтобы он перенаправлял только на номера, то сделайте следующее:

RewriteEngine On

RewriteCond %{HTTP_HOST} ^domain1.com$
RewriteRule ^([0-9])+$ http://domain2.com/folder/?p=$1 [R=301,L]

RewriteCond проверяет, если указанный vhost является domain1.com, а не domain2.com, то применяется правило перезаписи, и перенаправляет через HTTP-статус 301 [R=301] только числовые строки (0-9)+, состоящие хотя бы из одного числа на указанный URL. [L] делает это правило последним.

person Residuum    schedule 17.08.2009
comment
Возможно, я забыл упомянуть об этом, но ТОЛЬКО доступ к domain/4433 должен перенаправляться на domain.com/folder/?p=4333 один только domain.com не должен перенаправляться. - person Coreus; 17.08.2009
comment
Вы что-то перепутали. [(0-9)+] скорее должно быть ([0-9])+. - person Gumbo; 17.08.2009
comment
Спасибо, Гамбо. Я исправил эту опечатку / thinko. - person Residuum; 17.08.2009

person    schedule
comment
Если оба домена работают с одним и тем же vhost, это даст бесконечный цикл перенаправления. - person Residuum; 17.08.2009
comment
@Residuum: не только в этом случае. Подстановка — это просто относительный путь. Таким образом, /4433 будет перенаправлен на /domain.com/folder?p=4433, который будет перенаправлен на /domain.com/domain.com/folder?p=domain.com/folder, который будет перенаправлен на /domain.com/domain.com/domain.com/folder?p=domain.com/domain.com/folder и т. д. - person Gumbo; 17.08.2009
comment
Спасибо, ребята, за комментарий к моему неосторожному ответу. Я попытался внести (возможно, еще одно небрежное) исправление. Я предполагаю, что реальное решение будет зависеть от того, как будет выглядеть полный набор действительных URL-адресов для домена. - person Zed; 17.08.2009