htaccess и перезапись URL

У меня есть список URL-адресов, например,

http://www.mywebsite.com/page.php?genus=A_GENUS&species=A_SPECIES&id=12345.

Я хотел бы написать .htaccess, который постоянно перенаправляет посещения этой формы URL-адреса на следующий URL-адрес,

http://www.mywebsite.com/species/A_GENUS/A_SPECIES.

Можно ли сделать это без необходимости вручную перечислять каждый вид в базе данных?

Я пытался найти его, но моя голова находится в стране WordPress-Custom-Post-Type, и поэтому мой мозг не работает должным образом. Любая помощь будет принята с благодарностью.

EDIT: уточнение

В настоящее время мой .htaccess полностью пуст. Я переписываю свой веб-сайт, чтобы использовать совершенно новую CMS и этот новый формат URL. Старый формат URL перестанет существовать, но вся информация по-прежнему будет использоваться.

У нас довольно высокий рейтинг по многим видам в Google, и я хотел бы, чтобы посетители оттуда могли просматривать необходимую им информацию, несмотря на изменение формата URL.

Эти изменения еще не произошли (по-прежнему используется среда песочницы для новой версии сайта), и я хотел бы внести изменения в URL-адрес непосредственно перед тем, как начать работу с новой версией.

РЕДАКТИРОВАТЬ 2: Новый сайт .htaccess

Содержимое .htaccess нового сайта полностью выглядит так:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /sandboxfolder/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /sandboxfolder/index.php [L]
</IfModule>

# END WordPress

ИЗМЕНИТЬ ответ Гармена

RewriteEngine On
RewriteBase /sandboxfolder/
RewriteCond %{QUERY_STRING} genus=([a-zA-Z0-9-]+)&species=([a-zA-Z0-9-]+)
RewriteRule ^profile.php$ /species/%1/%2 [R=302]

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /sandboxfolder/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /sandboxfolder/index.php [L]
</IfModule>
# END WordPress

Не уверен, правильно ли я использовал RewriteBase, но, похоже, он не работает ни с ним, ни без него.

С уважением,


person turbonerd    schedule 27.12.2011    source источник
comment
Что сейчас содержит ваш htaccess? Старый адрес еще работает? Новый URL-адрес уже перезаписывается (внутри) на старый?   -  person Gerben    schedule 27.12.2011
comment
Извините, Гербен, я обновлю свой пост соответственно.   -  person turbonerd    schedule 27.12.2011
comment
Будет ли новая CMS не использовать htaccess? Всегда ли url-параметры в таком порядке при создании ссылок на старом сайте?   -  person Gerben    schedule 27.12.2011
comment
Новая CMS будет использовать htaccess, да. Я снова обновлю свой пост :) URL-адреса на старом сайте всегда имеют именно такой формат, да.   -  person turbonerd    schedule 27.12.2011
comment
Задавать четкие вопросы так же сложно, как и отвечать на них :) См. ответ ниже.   -  person Gerben    schedule 27.12.2011


Ответы (1)


RewriteEngine On
RewriteCond %{QUERY_STRING} genus=([a-zA-Z0-9-]+)&species=([a-zA-Z0-9-]+)
RewriteRule ^page.php$ /species/%1/%2? [L,R=302]

Это предполагает очень специфический порядок параметров строки запроса. Так что будьте осторожны. Также предполагается, что имена содержат только простые буквы, цифры или тире.

Измените 302 на 301, когда вы закончите тестирование. Я использовал 302, потому что 301 агрессивно кэшируются браузерами, что очень затрудняет отладку.

EDIT: вы должны добавить это выше других правил перезаписи, которые у вас есть, иначе это не сработает.

EDIT 2: добавлено ? в конце, чтобы удалить строку запроса. И флаг L для предотвращения дальнейшего выполнения.

person Gerben    schedule 27.12.2011
comment
Это имеет смысл в моей голове и выглядит идеально, я надеюсь! Я попробую сейчас. Большое спасибо за вашу помощь, Гербен - как только я поиграю, я позабочусь о том, чтобы вы получили правильный ответ :) - person turbonerd; 27.12.2011
comment
Привет снова Гарбен. Он работает, но добавляет к URL дополнительную информацию: /species/Parasphaerichthys/lineatus?genus=Parasphaerichthys&species=lineatus&id=1565 - person turbonerd; 27.12.2011
comment
Кроме того, при использовании выше моих правил WordPress код вообще не работает. Это потому, что WordPress перезаписывает все файлы, которые не являются index.php, обратно на индексную страницу? Тем не менее, я поместил код над этими правилами, как вы указали, но правила WordPress по-прежнему имеют приоритет. Я обновлю свой исходный пост, чтобы показать вам, как я написал .htaccess, если это неправильно. - person turbonerd; 27.12.2011
comment
Расположение правильное, но я заметил, что вы использовали profile.php, а не page.php. Попробуйте добавить флаг L: [L,R=302] - person Gerben; 27.12.2011
comment
О, Гарбен, еще одно: чувствительны ли эти URL-адреса к регистру? то есть, если у меня есть Parasphaerichthys, будет ли это работать для перезаписи /parasphaerichthys/ или это зависит от моей CMS? - person turbonerd; 29.12.2011