При использовании перезаписи URL файлы включаются несколько раз?

Я разрабатываю новый сайт в ColdFusion 10 и немного переписываю URL-адреса, используя файл .htaccess. У меня есть три правила, которые работают очень хорошо, когда я вызываю их без других включений. Когда я оборачиваю их в include, я получаю сообщение об ошибке.

Вот мои правила:

RewriteEngine on
RewriteRule ^advertise$ /index.cfm?Section=Advertise
RewriteRule ^bike/([0-9]+)/([0-9]+)/ /index.cfm?Section=Bike&BikeID=$1&FeatureID=$2
RewriteRule ^bike/([0-9]+)/ /index.cfm?Section=Bike&BikeID=$1

Индексная страница указывает, какой раздел показывать, и вызовы включают соответствующий файл, обернутый вокруг верхнего и нижнего колонтитула, например:

include "header.cfm"; 
include "#VARIABLES.Section#.cfm";
include "footer.cfm";

Проблема в том, что это не совсем работает для страниц «Велосипед», вторые два правила. Похоже, что заголовочный файл включен несколько раз, что делает ссылки на CSS и другие файлы неверными, что приводит к беспорядку на странице. Если я закомментирую верхний и нижний колонтитулы, все будет работать нормально, но верхнего или нижнего колонтитула нет, а это не то, что мне нужно.

// include "header.cfm"; 
include "#VARIABLES.Section#.cfm";
// include "footer.cfm";

Есть ли что-то в правилах перезаписи URL-адресов, из-за чего страницы велосипеда загружаются несколько раз, а затем терпят неудачу?

http://flyingpiston2012-com.securec37.ezhostingserver.com/

Вы можете попробовать страницу здесь и увидеть проблему, нажав на ссылки. Есть какие нибудь идеи как это починить?

ОБНОВИТЬ

Когда я делаю все свои ссылки абсолютными, включая полный URL-адрес, проблема исчезает.

<cfoutput>
<link href="#APP.Home#/bootstrap/css/bootstrap.css" rel="stylesheet">
</cfoutput>

Тем не менее, мне НЕ нужно указывать абсолютный путь к файлам. Любые намеки на то, почему это не работает для меня?

ОБНОВИТЬ

// THIS FIXES THE PROBLEM
<base href="#APP.Home#/">
<link href="/bootstrap/css/bootstrap.css" rel="stylesheet">

// THIS FIXES THE PROBLEM
<link href="#APP.Home#/bootstrap/css/bootstrap.css" rel="stylesheet">

// THIS IS THE PROBLEM
<link href="/bootstrap/css/bootstrap.css" rel="stylesheet">

person Evik James    schedule 17.06.2012    source источник
comment
Возможно, вы ссылаетесь на раздел переменных URL как на variable.section, а не на URL.section.   -  person Jake Feasel    schedule 17.06.2012
comment
Вы решили проблему? Я не вижу ничего плохого в включенной вами ссылке на сайт после просмотра всех страниц.   -  person nosilleg    schedule 18.06.2012
comment
Джейк, я убрал Section из области URL и поместил ее в область VARIABLES. Я не включил код, который это делает. Я исправил проблему. Вместо жесткого указания абсолютного пути в ссылках я использовал ‹base href=flyingpiston2012-com.securec37. .ezhostingserver.com› в голове. Это самый первый раз, когда я когда-либо использовал эту «базу». Я действительно не понимаю, как это было проблемой, хотя. Это обычное дело при использовании перезаписи URL?   -  person Evik James    schedule 18.06.2012
comment
Это не то, что я испытал. Единственное, что мне показалось странным в ваших переписываниях, это отсутствие [L,QSA], которое я добавляю в свой. Вам может понадобиться правило для flyingpiston2012-com.securec37.ezhostingserver.com/bike также.   -  person nosilleg    schedule 18.06.2012
comment
похоже, что заголовочный файл включается несколько раз... это или нет? IE: вы получаете несколько копий разметки заголовка (например, несколько тегов <link>) или вы просто получаете неправильный CSS? Просматривали ли вы журналы перезаписи, чтобы увидеть, выполняются ли правила так, как вы ожидаете (например, один раз для каждого запрошенного файла, и сопоставляются только правильные файлы, и они соответствуют совпало)? Кроме того, используете ли вы Apache или IIS (было сделано предположение, что это Apache, но IIS также может запускать файлы .htaccess с помощью модуля перезаписи ISAPI от Helicon). Пожалуйста, уточните.   -  person Adam Cameron    schedule 18.06.2012
comment
@nosilleg: я бы, конечно, с осторожностью выступал за добавление QSA. Моя позиция заключается в том, что это следует использовать только в ситуациях, когда RewriteRule не учитывает все параметры запроса, которые могут быть в URL-адресе, поэтому их необходимо учитывать. Он не должен в одностороннем порядке перекачивать все по URL-адресу на сервер приложений.   -  person Adam Cameron    schedule 18.06.2012
comment
@AdamCameron Есть ли проблемы с безопасностью / производительностью при включении QSA или просто ощущение, что это не чисто? (с каноническими тегами ссылок, используемыми для смягчения проблем с SEO)   -  person nosilleg    schedule 19.06.2012
comment
@nosilleg: На самом деле проблемы с безопасностью. Зачем разрешать через URL то, чего вы не ожидаете? Если CFM ожидает параметр foo, который может принимать заданное пользователем значение, но не ожидает ничего другого, зачем передавать остальную часть? Тем не менее, в некоторых обстоятельствах могут быть аргументы в обе стороны, я просто имею в виду, что делать это в одностороннем порядке может быть не лучшим подходом.   -  person Adam Cameron    schedule 19.06.2012
comment
@AdamCameron Поскольку любой может поместить что угодно в URL-адрес, я обычно использую подход, включающий QSA по умолчанию и удаляющий его только в том случае, если я знаю, что мне не нужны какие-либо строки запроса. (например, 301 переход со старого сайта на новый)   -  person nosilleg    schedule 20.06.2012


Ответы (3)


Это могло произойти из-за того, что вы не сказали Apache прекратить синтаксический анализ при совпадении. Попробуйте сделать так, чтобы правила выглядели так:

RewriteRule ^advertise$ /index.cfm?Section=Advertise [L]
RewriteRule ^bike/([0-9]+)/([0-9]+)/ /index.cfm?Section=Bike&BikeID=$1&FeatureID=$2 [L]
RewriteRule ^bike/([0-9]+)/ /index.cfm?Section=Bike&BikeID=$1 [L]
person Sergey Galashyn    schedule 18.06.2012
comment
Я надеялся, что такой совет, как ваш, был решением. Это не. У меня такая же проблема после добавления [L]. Забавно, я не видел ни одного примера использования [L] во всех учебниках, которые я нашел. - person Evik James; 18.06.2012

Какой бы ни была ваша проблема, попытка установить связь между правилами перезаписи .htaccess и файлами, включенными в CF, является неправильным подходом к устранению неполадок.

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

Когда вы включаете файл, он не делает запрос, поэтому веб-сервер (и, соответственно, модуль перезаписи) не задействован.

Я предполагаю, что если вы просто перейдете к переписанному URL-адресу страницы с велосипедами (например: /index.cfm?Section-Bije&BikeID=12345), вы увидите ту же проблему. Это показывает, что переписывание не является частью проблемы.

Вычеркните это понятие из своего расследования и просто посмотрите, как включаются ваши файлы. Для начала можно просто включить отладку и посмотреть на отображение времени выполнения с помощью представления TREE. Это даст вам представление о том, где/как/почему вы вызываете свои шаблоны несколько раз.

person Adam Cameron    schedule 18.06.2012
comment
Я полностью согласен, что это не правильное решение. Однако он отлично маскирует проблему. Буду продолжать искать решение. - person Evik James; 18.06.2012

Я не знаю, связано ли это, но я столкнулся с похожей проблемой с FW/1. Просматривая rewrite.log, я мог видеть, что каждый cfinclude, который на самом деле НЕ существовал, на самом деле проходил через Apache. Я добавил [NS] в .htaccess, и он исчез:

# rewrite rules, NS skips rewrite rule for internal sub-requests
# for FW/1, removes index.cfm from the URL
RewriteRule ^(.*)$ /index.cfm/$1 [NS,L]
person emeier    schedule 18.06.2012
comment
Читая это снова, я не уверен, что это та же проблема, что и у меня ... мое правило в основном заключалось в том, чтобы попасть в бесконечный цикл перезаписи, не похоже на то же самое для вашего. Я бы рекомендовал включить ведение журнала перезаписи... просто начните с низкого уровня трассировки и увеличивайте его по мере необходимости - http://httpd.apache.org/docs/current/mod/mod_rewrite.html#logging - person emeier; 18.06.2012
comment
Я подозреваю, что попадаю в какой-то цикл перезаписи. Я нахожусь на размещенном сервере и не имею доступа к журналам и тому подобному. Я попробую ваше предложение сегодня позже. Спасибо! - person Evik James; 18.06.2012
comment
Согласно моему предыдущему ответу, я рекомендую перестать смотреть на переписывания. Они почти наверняка не будут причиной того, что вы видите. Устраните проблему, просмотрев переписанный шаблон URL, т. е. не переходите к /bike/123/456/, перейдите к /index.cfm?Section=Bike&BikeID=123&FeatureID=456. Я достаточно уверен, что вы увидите ту же проблему с этим расширенным URL-адресом, что и с переписанным. - person Adam Cameron; 18.06.2012
comment
+1 к точке зрения Адама. Если проблема исчезает при просмотре переписанного URL-адреса, то это не имеет ничего общего с mod_rewrite. Кроме того, я не могу себе представить, чтобы пытаться выяснить проблемы перезаписи, если вы не можете включить ведение журнала. - person emeier; 19.06.2012