htaccess переписать все еще некоторые проблемы, получая немного сложный eek! - PullRequest
0 голосов
/ 14 апреля 2011

Еще одна редакция моей саги переписывания .htaccess.Сейчас все работает в определенной степени, но все еще есть некоторые проблемы.

У меня есть множество правил для перемещения старых URL-адресов в новые URL-адреса, передачи переменных и т. Д., Однако есть еще несколько вещей, которые мне нужно добавить, и длямоя жизнь не может понять.

У меня есть 3 URL, которые направляют / переписывают, как показано ниже.


1 www.mydomain.com/news/dentistry_dental/index.php

2 www.mydomain.com/news/dentistry_dental/index.php?month=April&year=2011

3 www.mydomain.com/news/dentistry_dental/article_detail.php?article=1234&title=some-title


Они перенаправляются и идеально переписываются на новые URL соответственно


1 www.mydomain.com/dental_news/

2 www.mydomain.com/dental_news/April-2011

3 www.mydomain.com/dental_news/1234-some-title


Однако ... Здесь проблема #1 Следующие URL-адреса также перенаправляются, как показано ниже


4 www.mydomain.com/news/it_technology / index.php? month = апрель & год = 2011

5 www.mydomain.com/news/it_technology/article_detail.php?article=1234&title=some-title


которыетакже направляет на те же URL-адреса, что и перенаправления зубов


4 www.mydomain.com/dental_news/April-2011

5 www.mydomain.com/dental_news/1234-some-title


Что не должно происходить.Новостные статьи it_technology были удалены, поэтому я хочу перенаправить их на мою домашнюю страницу с 410 или чем-то подобным, в зависимости от того, что действительно лучше.

Мой текущий .htaccess выглядит следующим образом.

Опции + FollowSymlinks RewriteEngine для

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 %{REQUEST_URI} !/generator/
    RewriteCond %{THE_REQUEST} ^.*/index.php
    RewriteRule ^(.*)index.php$ http://www.mydomain.com/$1 [R=301]

    RewriteRule ^products/dental-digital-imaging/([^/]*)_([^/]*)$ /products/digital_xray.php?id=$1&product=$2 [L]
    RewriteRule ^products/package_deals.php$ http://www.mydomain.com/products/dental-computer-network-bundles [R=301]
    RewriteRule ^products/computer_hardware.php$ http://www.mydomain.com/products/dental-computer-solutions [R=301]
    RewriteRule ^products/individual_computers.php$ http://www.mydomain.com/products/dental-computer-systems [R=301]
    RewriteRule ^products/digital_xray_imaging.php$ http://www.mydomain.com/products/dental-digital-imaging [R=301]

    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]

    # Rewrite URL stripping .php Extension
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME}\.php -f
    RewriteRule ^(.*)$ $1.php

Мое единственное другое требование - добавить косую черту в обслуживаемые файлы php (которые уже добавили расширение .php, удаленное с последним правилом в моем .htaccess)..

Я пробовал многочисленные способы, которые я нашел через Google, но все они связаны с другими моими правилами.

Надеюсь, кто-нибудь поможет мне закончить это раз и навсегда.

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

Ответы [ 2 ]

1 голос
/ 14 апреля 2011

Конечно становится все сложнее :) Попробуйте изменить эти строки (я думаю, что есть 2):

RewriteCond %{REQUEST_URI} !^/dental_news/

на:

RewriteCond %{REQUEST_URI} ^/news/dentistry_dental/

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

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

Как правило, ваша проблема в общих правилах:

#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]

Ограничьте их тем путем, который вы хотите переписать, т.е. замените .* на что-то более конкретное, например:

#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 ^news/dentistry_dental/index.php$ /dental_news/%1-%2? [L,R=301]

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

Вы можете сделать перенаправление news/it_technology в качестве стандартного перенаправления.

RewriteRule ^news/it_technology http://www.thepage.com/ [R=301,L]

Технически правильнее было бы сделать 410, но код 410 действительно необязателен.Вы также можете сделать это 404, а затем иметь ссылку со страницы 404 на главную страницу.

...