Первое: (i) hostgator не включит или не даст вам доступ к перезаписи журналов; (ii) ваша конфигурация suPHP имеет синтаксические ошибки, и hostgator почти наверняка делает это, а также отказы .htacess / php.ini в своих собственных конфигурациях root / vhost. Однако я сосредоточусь на элементах mod_rewrite:
RewriteEngine On
RewriteRule ^([A-Za-z0-9-]+)/?$ cities.html?state=$1
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ results.html?state=$1&city=$2
RewriteCond %{HTTP_HOST} ^example.com
RewriteRule (.*) http://www.example.com/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
Я также предполагаю, что у вас нет файлов .htaccess
в подкаталогах с включенным механизмом перезаписи, поскольку они могут вытеснить это в соответствии с правилами перезаписи "На каталог".
Правила (3) - это простой перенаправитель домена. Правило (4) является драконовским: перенаправьте любой URI, который не является существующим файлом или каталогом, на index.php в текущем каталоге, но оставив строку запроса нетронутой.
Правило (1) и (2) - ваши новые правила. Как говорит Майк, вы должны включить [L]
, но, поскольку файлы cities.html
и results.html
существуют, они все равно не будут совпадать.
Мне любопытно, почему конечный slach в URI необязателен. Лучше решить и исправить это.
Проблема заключается в том, что критерии соответствия для (1) и (2) являются двумя широкими и собирают URI, предназначенные для общего броска (4). Вы должны заблокировать это, чтобы сделать их взаимоисключающими. Одна из причин состоит в том, чтобы добывать ваши журналы доступа (которые доступны с hostgator), чтобы найти стандартные URI, ожидаемые приложением, и проверить, что ни один из них не соответствует (1) или (2) - однако, поскольку большинство будет содержать «.», Это наверное не тот случай. Но проверь.
Другая проблема заключается в том, используют ли существующие сценарии абсолютные или относительные ссылки, например, <img src="images/myimage.png">
в любом выходном HTML. Здесь браузер запросил http://www.example.com/texas/houston
скажет и поэтому будет искать http://www.example.com/texas/images/myimage.png
, который не соответствует (1), (2) или (3) и, следовательно, перехватывается (4) и передается в /index.php
. Ditto CSS-файлы и т. Д. Следовательно, они не будут 404, и index.php
запутаются и отправят какой-то ответ по умолчанию, который безнадежно запутает браузер.
Однако снова анализ журналов доступа (в данном случае или USI с реферером http://www.example.com/texas/houston
) покажет вам, если это происходит.
Если ваше приложение использует стандартные подкаталоги, вы можете исправить это с помощью правила (3.1), которое выглядит примерно так:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond $1/$2 -f
RewriteRule .*?(images|css|styles)/(.+) $1/$2 [L]
хотя детали будут зависеть от остальной части вашего заявления.