мод редирект и переписывает (часть 2) - PullRequest
0 голосов
/ 12 апреля 2011

В дополнение к моим предыдущим вопросам я попадаю в беспорядок, поэтому я постараюсь изложить свои проблемы как можно лучше здесь.

Я приводю в порядок свою структуру URL, но имеюпроблема в том, что мои URL-адреса хорошо индексируются в поисковых системах, поэтому мне нужно переписать мои URL-адреса, а также перенаправить их.

С помощью более раннего ответа на предыдущий вопрос у меня есть следующее в моем .htaccess

Options +FollowSymlinks
RewriteEngine on

rewritecond %{http_host} ^mydomain.com [nc]
rewriterule ^(.*)$ http://www.mydomain.com/$1 [r=301,nc]

# Rewrite all index.php to root: / ( with perm redirect )
RewriteCond %{THE_REQUEST} ^.*/index.php
RewriteRule ^(.*)index.php$ http://www.mydomain.com/$1 [R=301]

# Rewrite A newly added section rewrite ( no redirect required )
RewriteRule ^products/digital_imaging/([^/]*)/([^/]*)$ /products/digital_xray.php?id=$1&product=$2 [L]

# Rewrite dental news article to neat nice url
RewriteRule ^dental_news/([^/]*)/([^/]*)$ news/dentistry_dental/article_detail.php?article=$1&title=$2&redirect [L]

#Conditional rewrite of old news article path to new one with 301 redirect
RewriteCond %{REQUEST_URI} !^/dental_news/
RewriteCond %{QUERY_STRING} article=([0-9]*)&title=([^&]*)$
RewriteRule (.*) /dental_news/%1/%2? [L,R=301]

Итак, все это работает, как и ожидалось, но у меня есть другой URL, который заканчивается index.php, который иногда, но не всегда имеет переменные php, это мне также нужно переписать и перенаправить, пытаясь сделать это самостоятельноЯ создаю конфликт некоторых типов, и он не работает должным образом.

URL, который мне нужно переписать и перенаправить с 301, ниже

http://www.mydomain.com/news/dentistry_dental/index.php?month=February&year=2011

With the previous index.php rule it currently displays as

http://www.mydomain.com/news/dentistry_dental/?month=February&year=2011

Half way there i guess... I need it to be the following

http://www.mydomain.com/dental_news/February/2011

Имея в виду, что URLиногда не имеет переменных, как показано ниже

http://www.mydomain.com/news/dentistry_dental/index.php

Which is currently with the index.php rule above is showing as

http://www.mydomain.com/news/dentistry_dental/

This needs to be

http://www.mydomain.com/dental_news/

Так что да, я совершенно дурак в этом, это совершенно ново для меня, так что, если я смогу разобраться в этом, я буду действительно счастливым кроликом!

Спасибо всем

РЕДАКТИРОВАТЬ

Хорошо, мой текущий .htaccess выглядит так, как показано ниже.

Options +FollowSymlinks
RewriteEngine on

rewritecond %{http_host} ^mydomain.com [nc]
rewriterule ^(.*)$ http://www.mydomain.com/$1 [r=301,nc]

# Rewrite all index.php to root: / ( with perm redirect )
RewriteCond %{THE_REQUEST} ^.*/index.php
RewriteRule ^(.*)index.php$ http://www.mydomain.com/$1 [R=301]

RewriteRule ^products/digital_imaging/([^/]*)/([^/]*)$ /products/digital_xray.php?id=$1&product=$2 [L]

# Rewrite dental news article to neat nice url
RewriteRule ^dental_news/([^/]*)/([^/]*)$ news/dentistry_dental/article_detail.php?article=$1&title=$2&redirect [L]

#Conditional rewrite of old news article path to new one with 301 redirect
RewriteCond %{REQUEST_URI} !^/dental_news/
RewriteCond %{QUERY_STRING} article=([0-9]*)&title=([^&]*)$
RewriteRule (.*) /dental_news/%1/%2? [L,R=301]

RewriteCond %{QUERY_STRING} month=([^&]*)&year=([^&]*)
RewriteRule (.*) /dental_news/%1/%2? [R=301]
RewriteRule news/dentistry_dental/$ /dental_news/ [R=301]
RewriteRule ^dental_news/$ /news/dentistry_dental/index.php [L]

Как оно стоит с этим,Происходит следующее

www.mydomain.com/news/dentistry_dental/index.php 
-> www.mydomain.com/dental_news/ 

(^ Correct)

www.mydomain.com/news/dentistry_dental/index.php?month=May&year=2011 
-> www.mydomain.com/dental_news/April/2011 

(^ Неправильно: показывает правильный путь в строке URL, но отображает article_detail.php вместо index.php с переменными)

Я предполагаю, что 2 правила похожи, а одно - это выбор index.php с переменными года и месяца и отправка на страницу article_detail.Однако я могу ошибаться, и я не знаю, как исправить.

РЕДАКТИРОВАТЬ # 2

Текущий .htaccess, как показано ниже.

Options +FollowSymlinks
RewriteEngine on

rewritecond %{http_host} ^dentalsupportuk.com [nc]
rewriterule ^(.*)$ http://www.dentalsupportuk.com/$1 [r=301,nc]

# Rewrite all index.php to root: / ( with perm redirect )
RewriteCond %{THE_REQUEST} ^.*/index.php
RewriteRule ^(.*)index.php$ http://www.dentalsupportuk.com/$1 [R=301]

RewriteRule ^products/digital_imaging/([^/]*)/([^/]*)$ /products/digital_xray.php?id=$1&product=$2 [L]

# Rewrite dental news article to neat nice url
RewriteRule ^dental_news/([0-9]*)/([^/]*)$ news/dentistry_dental/article_detail.php?article=$1&title=$2&redirect [L]

#Conditional rewrite of old news article path to new one with 301 redirect
RewriteCond %{REQUEST_URI} !^/dental_news/
RewriteCond %{QUERY_STRING} article=([0-9]*)&title=([^&]*)$
RewriteRule (.*) /dental_news/%1/%2? [L,R=301]

RewriteCond %{QUERY_STRING} month=([^&]*)&year=([^&]*)
RewriteRule (.*) /dental_news/%1/%2? [R=301]
RewriteRule news/dentistry_dental/$ /dental_news/ [R=301]
RewriteRule ^dental_news/([a-zA-Z]*)/([0-9]*)$ news/dentistry_dental/index.php?month=$1&year=$2&redirect [L]

www.mydomain.com/dental_news/ теперь переписывает на www.mydomain.com/dental_news/, которого нет, поэтому ошибка 404 (следует переписать на www.mydomain.com/news/dentistry_dental/)

www.mydomain.com / dental_news / 100 / some-title теперь переписывает , как ожидается, www.mydomain.com/news/dentistry_dental/article_detail.php с переменными (работает)

www.mydomain.com / news / dentistry_dental / article_detail.php? Article = 100 & title = some-title is перенаправляет , как ожидается, на www.mydomain.com/dental_news/100/some-title иотображается правильно (работает)

www.mydomain.com / news / dentistry_dental / index.php? month = май & год = 2010 - это перенаправление , но при этом вылетает сообщение Firefox (Firefox обнаружил, что серверперенаправляет запрос на этот адрес таким образом, что никогда не будетmplete.) (Не работает, это какой-то цикл вызывает это?)

www.mydomain.com / dental_news / Июль / 2010 / переписывание дает мне ошибку 404.

Так что да, я повсюду, может быть, я поставил неправильный порядок или что-то в этом роде, но чем больше я запутываюсь, тем больше я боюсь все сломать.Есть идеи?

С уважением, M

1 Ответ

0 голосов
/ 12 апреля 2011

Попробуйте добавить следующие два правила:

RewriteCond %{QUERY_STRING} month=([^&]*)&year=([^&]*)
RewriteRule (.*) /dental_news/%1/%2? [R=301]

RewriteRule news/dentistry_dental/$ /dental_news/ [R=301]

Я не верю, что это вызывает какие-либо конфликты, и, кажется, охватывает два сценария, которые вы описали.

РЕДАКТИРОВАТЬ

ОК, поэтому, если я правильно понял, URL-адреса, которые /dental_news/2968/Redefining-oral-hygiene-intervention, следует переписать в /news/dentistry_dental/article_detail.php с соответствующими строками запроса.И тогда /dental_news/April/2011 следует переписать в /news/dentistry_dental/index.php.Так что ... если это так, вы можете добавить следующее правило:

RewriteRule ^dental_news/([a-zA-Z]*)/([0-9]*)$ news/dentistry_dental/index.php?month=$1&year=$2&redirect [L]

Возможно, имеет смысл также сделать следующее обновление:

Current: RewriteRule ^dental_news/([^/]*)/([^/]*)$ news/dentistry_dental/article_detail.php?article=$1&title=$2&redirect [L]

Обновлено: RewriteRule ^dental_news/([0-9]*)/([^/]*)$ news/dentistry_dental/article_detail.php?article=$1&title=$2&redirect [L]

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

РЕДАКТИРОВАТЬ 2 Я полагаю, что я проверил все предоставленные вами URL-адреса, и они, кажется, работают сейчас.Было несколько петель перенаправления, которые мы не учитывали.Надеюсь, это поможет ...

Options +FollowSymlinks
RewriteEngine on

rewritecond %{http_host} ^mydomain.com [nc]
rewriterule ^(.*)$ http://www.mydomain.com/$1 [r=301,nc]

# Rewrite all index.php to root: / ( with perm redirect )
RewriteCond %{THE_REQUEST} ^.*/index.php
RewriteRule ^(.*)index.php$ http://www.mydomain.com/$1 [R=301]

RewriteRule ^products/digital_imaging/([^/]*)/([^/]*)$ /products/digital_xray.php?id=$1&product=$2 [L]

RewriteRule dental_news/$ /news/dentistry_dental/?rewrite [L]

# Rewrite dental news article to neat nice url
# Protect from looping because of previous rules
RewriteCond %{QUERY_STRING} !rewrite 
RewriteRule ^dental_news/([0-9]*)/([^/]*)$ news/dentistry_dental/article_detail.php?article=$1&title=$2&rewrite [L]

#Conditional rewrite of old news article path to new one with 301 redirect
RewriteCond %{REQUEST_URI} !^/dental_news/
RewriteCond %{QUERY_STRING} article=([0-9]*)&title=([^&]*)$
RewriteRule (.*) /dental_news/%1/%2? [L,R=301]

RewriteCond %{REQUEST_URI} !^/dental_news/
RewriteCond %{QUERY_STRING} month=([^&]*)&year=([^&]*)$
RewriteRule (.*) /dental_news/%1/%2? [R=301]


# Protect from looping because of previous rules
RewriteCond %{QUERY_STRING} !rewrite 
RewriteRule news/dentistry_dental/$ /dental_news/ [R=301]

# Protect from looping because of previous rules
RewriteCond %{QUERY_STRING} !rewrite 
RewriteRule ^dental_news/([a-zA-Z]*)/([0-9]*)/?$ news/dentistry_dental/index.php?month=$1&year=$2&rewrite [L]

Надеюсь, это поможет.

...