Как мне отключить нежелательные запросы? (MySQL, .htaccess, PHP)

#php #mysql #.htaccess #mod-rewrite

#php #mysql #.htaccess #мод-перезапись

Вопрос:

Для начала я новичок в PHP и .htaccess. Вот моя дилемма…

Я создал динамические страницы и использовал htaccess для перезаписи URL-адресов. Существует 3 типа страниц… Примеры:

Состояние: example.com/massachusetts-colleges.html

Город: example.com/massachusetts-colleges/boston-ma-colleges.html

Колледж: example.com/massachusetts-colleges/boston-ma-colleges/harvard.html

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

example.com/boston-ma-colleges.html

URL-адреса состояния хранятся в таблице местоположений в базе данных (stateSlug = массачусетс-колледжи). URL-адреса городов также хранятся в таблице местоположений в базе данных, и соответствующий список штатов также хранится вместе с этим городом (citySlug = boston-ma-colleges и stateSlug = massachusetts-colleges). Колледжи хранятся в другой таблице и используют идентификаторы для соответствия городам.

Как я могу использовать .htaccess, чтобы запретить доступ к любым «ДРУГИМ» URL-адресам (страница отображает шаблон и не содержит данных) и отображать страницу 404 (или перенаправлять на домашнюю страницу)?

Вот как теперь выглядит мой файл .htaccess:

 RewriteEngine on
RewriteRule ^([^/.] ).html?$ php/statePage.php?stateSlug=$1 [L]
RewriteRule ^([^/.] )-colleges/([^/.] ).html?$ php/cityPage.php?citySlug=$2amp;stateSlug=$1 [L]
RewriteRule ^([^/.] )-colleges/([^/.] )/([^/.] ).html?$ php/collegePage.php?collegeSlug=$3amp;citySlug=$2amp;stateSlug=$1 [L]
  

Опять же, я несколько новичок в языках htaccess и php. Я был бы признателен за любую помощь в этом вопросе.

Спасибо!

Ответ №1:

Предполагая, что весь ваш контент соответствует одному из приведенных выше URL-адресов, вы можете просто запретить доступ ко всему остальному, добавив в конец еще одно правило:

 RewriteRule ^(.*)$ - [F]
  

Чтобы не связываться с запросами ваших изображений и CSS, вы должны добавить:

 RewriteCond %{REQUEST_FILENAME} !.(jpg|png|gif|js|css)$ [NC]
RewriteRule ^(.*)$ - [F]
  

Если у вас есть каталоги, которые должны быть недоступны, поместите в них .htaccess только со следующим:

 Order deny,allow
deny from all
  

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

1. Я просто попытался добавить то, что вы мне сказали, и это вызвало «Запрещенный» на страницах, которые должны отображаться…

Ответ №2:

Попробуйте следующее, но замените index.php на свою страницу 404:

 Order allow,deny
Allow from all
RewriteEngine On

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$l [L]
  

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

Я получил это с вики-страницы CodeIgniter по адресу http://codeigniter.com/wiki/mod_rewrite /

Их вики-страница была очень полезна, когда я пытался решить аналогичную проблему.

Ответ №3:

перепишите все ваши общедоступные файлы в поддельный каталог /allow/.. , отобразите 404 для любого запроса, которого нет в /allow/.. каталоге. Наконец, перепишите файлы из /allow/.. реального каталога.

Это отличный обходной путь, IMO 🙂 Лучше, чем использовать deny all в каждом каталоге…

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

1. Спасибо… В итоге я выяснил кое-что, чего не было в htaccess… Я использовал код страницы, чтобы проверить наличие slug в БД и изменить заголовок на 404, если его там нет.