#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, если его там нет.