2013-12-08 7 views
0

На данный момент мы одна страница, которая показывает список ссылок каждая ссылка имеет свой собственный идентификационный номер.htaccess перезаписи URL и перенаправлять 301

каждое звено получает открытый с файлом info.php? ID = X

, например:

www.mysite.com/info.php?ID=1 shows the link "weather italy" 
www.mysite.com/info.php?ID=2 shows the link "weather france" 

Поскольку у нас есть несколько ссылок на «погоду в Италии» и «погода Франции», мы хотели бы переписать новые URL (погода-Италия и погода-Франция) в .htacces Whith новые URL-адреса, которые мы имели бы Структура:

www.mysite.com/weather-italy/info.php?ID=1

www.mysite.com/weather-france/info.php?ID=2

С в следующем коде мы сообщим серверу переписать URL-адреса и вызвать исходный файл:

RewriteRule ^weather-italy/info.php?$ info.php [NC,L] 
RewriteRule ^weather-france/info.php?$ info.php [NC,L] 

Это прекрасно работает.

Чтобы избежать двойной индексации мы хотим перенаправить 301 старую ссылку на новую ссылку.

Мы добились того, что с помощью следующего кода:

RewriteCond %{THE_REQUEST} \?ID=1 
RewriteRule ^info\.php$ http://www.touristinfo.fr/weather-italy/info\.php [L,R=301] 

RewriteCond %{THE_REQUEST} \?ID=2 
RewriteRule ^info\.php$ http://www.touristinfo.fr/weather-france/info\.php [L,R=301] 

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

Что не так с нашим кодом?

Большое спасибо за вашу помощь :)

ответ

0

%{THE_REQUEST} должен соответствовать только если URL вы хотите, чтобы соответствовать внешний запрос. Ваша проблема заключается в том, что созданное вами регулярное выражение недостаточно специфично.

Давайте рассмотрим, что произойдет. Вы идете на example.com/info.php?ID=2. Первые два правила не совпадают, но четвертый делает. Вы получаете перенаправление на example.com/weather-france/info.php?ID=2.

Это снова проходит через ваш .htaccess. Второе правило соответствует и внутренне переписывает его на info.php?ID=2. Флаг [L] здесь не имеет значения, потому что URL будет тянут через .htaccess, пока он не перестанет меняться. Во втором цикле через .htaccess URL теперь будет соответствовать четвертому правилу, хотя внешний запрос содержит /weather-france/info.php?ID=2. ID=2 также находится во внешнем запросе, а внутренняя перезапись теперь info.php.

Исправление состоит в том, чтобы сделать %{THE_REQUEST} достаточно подходящим, чтобы переписанный URL-адрес больше не соответствовал ему.

На дополнительной ноте: Знакомые себя с различием регулярных выражений и строк в RewriteRule с и RewriteCond с. Вы избежали точки в строке, оставив точку в нережиме регулярного выражения. ? «соответствует предыдущему символу 0 или 1 раз», а не буквенному знаку вопроса.Строку запроса нельзя сопоставить в первом аргументе RewriteRule.

Вы будете в конечном итоге с:

RewriteRule ^weather-italy/info\.php$ info.php [NC,L] 
RewriteRule ^weather-france/info\.php$ info.php [NC,L] 

RewriteCond %{THE_REQUEST} ^(GET|POST)\ /info\.php\?ID=1 
RewriteRule ^info\.php$ http://example.com/weather-italy/info.php [L,R] 

RewriteCond %{THE_REQUEST} ^(GET|POST)\ /info\.php\?ID=2 
RewriteRule ^info\.php$ http://example.com/weather-france/info.php [L,R] 
+0

Используя код, предложенный Sumurai8 теперь перенаправляет и записывает URLs должным образом. – matbosco

+0

у нас все еще есть один вопрос. Мы хотели бы вернуть код ошибки 301 при вызове старой ссылки, поэтому мы заменили R на R = 301. Старая ссылка stil возвращает код 200. Почему это происходит? Цель перенаправления состояла в том, чтобы вернуть код 301. – matbosco

+0

Изменен ли URL-адрес в строке url? Если да, то это происходит с кодом статуса 301 или 302. Если нет, очистите кеш. Вы, скорее всего, смотрите код состояния, который отправляется 'weather-country/info.php', который должен быть 200. – Sumurai8

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