htaccess переписывает все еще некоторые проблемы, становится немного сложнее!

#.htaccess #mod-rewrite #redirect #url-rewriting

#.htaccess #мод-перезапись #перенаправление #перезапись url

Вопрос:

Еще один выпуск моей саги о перезаписи .htaccess. Теперь все работает в определенной степени, но все еще есть некоторые проблемы.

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

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


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

2 www.mydomain.com/news/dentistry_dental/index.php?month=Aprilamp;year=2011

3 www.mydomain.com/news/dentistry_dental/article_detail.php?article=1234amp;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=Aprilamp;year=2011

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


Которые также направляются на те же URL, что и перенаправления dental


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

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


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

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

Параметры следующие ссылки перезаписать движок на

 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=$1amp;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=$1amp;title=$2amp;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]*)amp;title=([^amp;]*)$
    RewriteRule (.*) /dental_news/%1-%2? [L,R=301]

    RewriteCond %{REQUEST_URI} !^/dental_news/
    RewriteCond %{QUERY_STRING} month=([^amp;]*)amp;year=([^amp;]*)$
    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=$1amp;year=$2amp;rewrite [L]

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

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

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

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

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

Ответ №1:

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

 RewriteCond %{REQUEST_URI} !^/dental_news/
  

Для:

 RewriteCond %{REQUEST_URI} ^/news/dentistry_dental/
  

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

Комментарии:

1. Привет, clmarquart, еще раз спасибо за ваш вклад, я также попробую этот вариант и вскоре отчитаюсь, еще раз большое спасибо за вашу помощь. С уважением, M

2. Сработало отлично — я также перенаправил свои старые страницы новостей ит, так что все отсортировано, теперь сортируются только косые черты в конце 🙂

Ответ №2:

Тривиально, ваша проблема заключается в универсальных правилах:

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

RewriteCond %{REQUEST_URI} !^/dental_news/
RewriteCond %{QUERY_STRING} month=([^amp;]*)amp;year=([^amp;]*)$
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]*)amp;title=([^amp;]*)$
RewriteRule ^news/dentistry_dental/index.php$ /dental_news/%1-%2? [L,R=301]

RewriteCond %{REQUEST_URI} !^/dental_news/
RewriteCond %{QUERY_STRING} month=([^amp;]*)amp;year=([^amp;]*)$
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 на главную страницу.

Комментарии:

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

2. Изменение существующих правил сработало, однако вторая перезапись для it_Techonolgy не сработала, я разобрался с этим сейчас и использовал решение ниже. Просто нужно отсортировать мои завершающие косые черты сейчас. 🙂