.htaccess rewriterule / штат / город / - PullRequest
0 голосов
/ 24 января 2012

Это потребует небольшого количества объяснения, поэтому я надеюсь, что я не потеряю здесь всех.

Мне нужно было получить что-то вроде следующего:
http://example.com/results.html?state=iowa&city=davenport

превратился в:
http://example.com/iowa/davenport/

Мне удалось сделать это с помощью этих двух rewriterules:

RewriteRule ^ ([A-Za-z0-9 -] +) /? $ Towns.html? State = $ 1
RewriteRule ^ ([A-Za-z0-9 -] +) / ([A-Za-z0-9 -] +) /? $ Results.html? State = $ 1 & city = $ 2

Проблема в том, что в бэкэнде есть «какой-то код», который ломается в результате второй перезаписи. Это связано с заполнением поля выбора на основе результатов другого выбранного (хотя я не думаю, что это имеет значение). Я думаю, проблема в том, что я слишком широко изменяю / штат / город.

Вот копия моего полного (модифицированного для безопасности) файла .htaccess:

IndexIgnore *
AddHandler application/x-httpd-php5 .html .htm

RewriteRule ^([A-Za-z0-9-]+)/?$ cities.html?state=$1
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ results.html?state=$1&city=$2

<Files .htaccess>
order allow,deny
deny from all
</Files>

RewriteEngine On
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]

<IfModule mod_suphp.c>
 suPHP_ConfigPath /home/USER
<Files php.ini>
 order allow,deny
 deny from all
</Files>

Код, который он испортит, очень сложен, и это чужой код. Через пару часов я не смог пройтись по всем их вещам, чтобы даже приблизиться к тому, что я мог бы изменить с их стороны, чтобы все заработало.

У кого-нибудь есть ЛЮБЫЕ идеи о том, что я мог бы сделать, чтобы избежать этой проблемы? У меня действительно есть только 3 .html файла, через которые я передаю свой код интерфейса, поэтому я попробовал что-то вроде

мои переписчики

и то же самое с использованием просто «files» вместо filesMatch. Все, что я придумал, так или иначе ломает что-то еще или весь сайт.

Ответы [ 2 ]

1 голос
/ 24 января 2012

Первое: (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]

хотя детали будут зависеть от остальной части вашего заявления.

0 голосов
/ 24 января 2012

Мне удалось решить эту проблему, изменив мои (соответствующие) записи .htaccess на следующие:

RewriteEngine OnRewriteRule ^ ([A-Za-z0-9 -] +) /? $ Towns.html? State = $ 1RewriteCond% {REQUEST_URI}! ^ / Signup /RewriteRule ^ ([A-Za-z0-9 -] +) / ([A-Za-z0-9 -] +) /? $ Results.html? State = $ 1 & city = $ 2RewriteCond% {HTTP_HOST} ^ example.comRewriteRule (. *) http://www.example.com/$1 [R = 301, L]RewriteCond% {REQUEST_FILENAME}! -FRewriteCond% {REQUEST_FILENAME}! -DRewriteRule.index.php [L]

Это добавление:

RewriteCond% {REQUEST_URI}! ^ / Signup /

HostGator смог обнаружить, что проблема была/ Регистрация где-то в журнале, где-то, никогда не узнавал, какой журнал они могли просматривать, но я предполагаю, что это было то, к чему у меня не было доступа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...