2016-09-22 2 views
2

Я использую апачский RewriteMap с текстовым файлом, чтобы отобразить старые адреса на новые URL, в моем файле (red.map) У меня естьApache RewriteMap с подстановочным условием

/old-awful-url.html /new-lovely-shiny-url.html 

Тогда в моем апаче конфигурации у меня есть : -

RewriteEngine On 
RewriteMap  migration  txt:/home/red.map 
RewriteCond  ${migration:$1} /.+ 
RewriteRule  ^(/.*) ${migration:$1} [L,R=301] 

Это прекрасно работает, но теперь я хотел бы добавить подстановочные в состоянии соответствовать также некоторые старые URLs, которые имеют один и тот же конец, но имеют перед /cgi-bin/scriptname, например, я также хочу, чтобы соответствовать /cgi-bin/scriptname/old-awful-url.html

Я попытался изменить к RewriteCond, чтобы: -

RewriteCond  ^.*${migration:$1} /.+ 

Думая это будет соответствовать что-нибудь перед URL в файле, с и без CGI части, я попробовал несколько комбинаций, но безуспешно, Это возможно?

ответ

1

Вам необходимо установить /cgi-bin/scriptname в качестве необязательного шаблона в вашей директиве RewriteRule. И директива RewriteCond здесь совершенно не нужна.

RewriteEngine On 
RewriteMap migration txt:/home/red.map 

RewriteRule ^(?:/cgi-bin/scriptname)?(/.*) ${migration:$1} [L,R=301] 

Однако this'd неудачу в случае, если вы хотите переписаны URL включить /cgi-bin/scriptname часть снова. Для этого вам нужно разбить правила на два (или более?):

RewriteEngine On 
RewriteMap migration txt:/home/red.map 

RewriteCond ${migration:$1} . 
RewriteRule ^(/.*) ${migration:$1} [L,R=301] 

RewriteCond ${migration:$2} . 
RewriteRule ^/(cgi-bin/scriptname)(/.*) /$1${migration:$2} [L,R=301] 
+0

Спасибо, отлично работает! –

+1

Привет @ hjpotter92, я думаю, RewriteCond необходим для обработки дела, что lookup возвращает пустую строку на несоответствие. В противном случае RewriteRule в вашем первом фрагменте будет запущен даже при несоответствии (и перенаправляется на корень документа вместо правильного 404). Ваш второй фрагмент, вероятно, не работает в этом порядке, так как шаблон первого правила также соответствует 'cgi-bin/scriptname'. – martin

+0

@martin Карта позаботится об этом. – hjpotter92

Смежные вопросы