Запрет в htaccess на несуществующие урлы

12
M
На сайте с 17.08.2008
Offline
83
2991

День добрый! Прошу помощи, уважаемые!

Есть старенький сайт без ЧПУ, урлы вида GET передачи переменных index.php?name=Pages&op=cat............. и т.д. В выдаче гугла большая каша из несуществующих страниц с добавлением несуществующих параметров.

Прописал строчку:

ErrorDocument 404 /404.html

Однако при добавлении аброкадабры к существующей ссылке, открывается страница с последним действующим параметром идя по переменным справа на лево. Например урл:

http://site.ru/index.php?name=Pages&op=cat

и к нему добавить следующее

http://site.ru/index.php?name=Pages&op=catывавыаываыва

то в строке браузера останется данный урл, и откроется страница с содержанием

http://site.ru/index.php?name=Pages&op=cat

Если http://site.ru/index.php?name=Pages&op=cappppppp , то т.к. переменная cat была нарушена урл в строке браузера остается такой же, а выдается содержимое страницы http://site.ru/index.php?name=Pages

Если http://site.ru/index.phываыва (нарушена главная страница), то в строке браузера остается данный урл, а содержимое выдается файла 404 ошибки.

Вопрос: Что нужно прописать, что бы при несуществующих страницах отдавалась страница с ошибкой 404 и как поставить запрет на индексацию так страниц?

Буду крайне благодарен за Вашу помощь!

siv1987
На сайте с 02.04.2009
Offline
427
#1

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

systemiv
На сайте с 05.07.2012
Offline
60
#2

Делайте редирект например на главную, при ошибке 404, а еще лучше создайте страничку 404 и сливать туда

M
На сайте с 17.08.2008
Offline
83
#3
systemiv:
Делайте редирект например на главную, при ошибке 404, а еще лучше создайте страничку 404 и сливать туда

Здравствуйте, вроде бы так и сделал - посмотрите, я прописал директиву соответствующую и создал страницу ошибки:

Midnik:

Прописал строчку:
ErrorDocument 404 /404.html


Однако при добавлении аброкадабры к существующей ссылке, открывается страница с последним действующим параметром идя по переменным справа на лево. Например урл:
http://site.ru/index.php?name=Pages&op=cat
и к нему добавить следующее
http://site.ru/index.php?name=Pages&op=catывавыаываыва
то в строке браузера останется данный урл, и откроется страница с содержанием
http://site.ru/index.php?name=Pages&op=cat

Если http://site.ru/index.php?name=Pages&op=cappppppp , то т.к. переменная cat была нарушена урл в строке браузера остается такой же, а выдается содержимое страницы http://site.ru/index.php?name=Pages

Если http://site.ru/index.phываыва (нарушена главная страница), то в строке браузера остается данный урл, а содержимое выдается файла 404 ошибки.

И проблему я здесь же процитировал.

siv1987
На сайте с 02.04.2009
Offline
427
#4

Вам выше дали ответ по поводу ваших проблем.

siv1987:
делать нормальную проверку у себя в скрипте.
M
На сайте с 17.08.2008
Offline
83
#5
siv1987:
А еще лучше делать нормальную проверку у себя в скрипте.

Увы, но я не понимаю о чем речь. Я думал, что такие вещи настраиваются в хэтэасессе. Сайт создан на старой цмс slaed. Впринципе, в свое время перелапачивал его полностью своими силами, тямы хватало, может и сейчас хватит, если поднаправите в какую сторону копать.

siv1987
На сайте с 02.04.2009
Offline
427
#6
Midnik:
Увы, но я не понимаю о чем речь. Я думал, что такие вещи настраиваются в хэтэасессе.

Нет, к сожалению именно такие вещи в htaccess не настраиваются. Для htaccess есть файл index.php, он рабочий, остальные параметры которые ему передаются его не волнуют. Вы должны у себя в скрипте настроить правильную обработку всех входящих переменных и выдавать соответствующие заголовки. Как вариант, можно через мод_реврайт проверить входящие переменные, и если они не соответствует шаблону закрыть закрыть доступ или сделать редирект на верный вариант, что-то примерно по вашему случаю

RewriteEngine On

RewriteCond %{QUERY_STRING} ^(name=[&]+&op=cat)[.]

RewriteRule ^(index\.php) /$1?%1 [R=301,L]

cat естественно заменить на имена ваших категорий, или смотря что у вас там

M
На сайте с 17.08.2008
Offline
83
#7
siv1987:
Нет, к сожалению именно такие вещи в htaccess не настраиваются. Для htaccess есть файл index.php, он рабочий, остальные параметры которые ему передаются его не волнуют. Вы должны у себя в скрипте настроить правильную обработку всех входящих переменных и выдавать соответствующие заголовки. Как вариант, можно через мод_реврайт проверить входящие переменные, и если они не соответствует шаблону закрыть закрыть доступ или сделать редирект на верный вариант, что-то примерно по вашему случаю

RewriteEngine On
RewriteCond %{QUERY_STRING} ^(name=[&]+&op=cat)[.]
RewriteRule ^(index\.php) /$1?%1 [R=301,L]


cat естественно заменить на имена ваших категорий, или смотря что у вас там

Полазив немного в интернете, потупив пару часов..... Пришел за вопросом-советом

У сайта максимально длинные урлы с переменными идут вот такого вида:

/index.php?name=Pages&op=cat&id=132

/index.php?name=Pages&op=page&id=132&pid=11599

Т.е. переменная Name - это текущий раздел Pages в рамках которого и построен весь сайт (т.е. используя только этот раздел, одна переменная)

Есть переменная Op - которая выдает либо подразделы Сat, которые определяются по Id, либо выдает страницу Page (можно назвать ее подробным описанием), которая определяется по подразделу Id (привязанному к Cat), имея свой уникальный айди номер - Pid

Я правильно из данных соображений (опираясь на Ваш пример) строю следующую конструкцию:

RewriteCond %{QUERY_STRING} ^(name=[A-Za-z]+&op=[A-Za-z]+&id=[0-9]+&pid=[0-9])[.]

?

Я не особо в синтаксисе, а как я понял это стандартный синтаксис регулярных выражений пхп, которые в свое время я не изучал вообще. И вот выше описанной строчкой мы определяем наш урл и если он не определяется, то редиректим пользователя третьей строчкой на главную - правильно? А если соответственно редеректить нужно на страницу ошибки, то что-то вот такое должно получиться:

RewriteRule ^(404\.html) /$1?%1 [R=301,L]?

siv1987
На сайте с 02.04.2009
Offline
427
#8
Midnik:
Я не особо в синтаксисе, а как я понял это стандартный синтаксис регулярных выражений пхп

Это стандартный синтаксис PCRE который используется и в php.

Midnik:
И вот выше описанной строчкой мы определяем наш урл и если он не определяется, то редиректим пользователя третьей строчкой на главную - правильно?

В примере на самом деле редиректится не на главной а на "правильный" урл.

А если соответственно редеректить нужно на страницу ошибки, то что-то вот такое должно получиться:

Синтаксис неправильный, но страницу ошибки надо не редиректить, а реврайтить.

Милованов Ю.С
На сайте с 24.01.2008
Offline
196
#9

Вот топик про борьбу с дублями, почитайте, там все достаточно информативно.

Подпись))
siv1987
На сайте с 02.04.2009
Offline
427
#10

ТС, можете попробовать (выбрать один вариант)

для страницы ошибки

RewriteEngine On

RewriteCond %{QUERY_STRING} !^name=[a-zA-Z]+&op=[a-zA-Z]+&id=\d+$

RewriteCond %{QUERY_STRING} !^name=[a-zA-Z]+&op=[a-zA-Z]+&id=\d+&pid=\d+$

RewriteRule ^index\.php 404.html [G,L]

для редиректа

RewriteEngine On

RewriteCond %{QUERY_STRING} ^(name=[a-zA-Z]+&op=[a-zA-Z]+&id=\d+&pid=\d+).

RewriteRule ^index\.php /index.php?%1 [R=301,L]

RewriteCond %{QUERY_STRING} !^name=[a-zA-Z]+&op=[a-zA-Z]+&id=\d+&pid=\d+$

RewriteCond %{QUERY_STRING} ^(name=[a-zA-Z]+&op=[a-zA-Z]+&id=\d+).

RewriteRule ^index\.php /index.php?%1 [R=301,L]

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий