Есть ли способ отфильтровать неподдерживаемые форматы в файле маршрутов? - PullRequest
1 голос
/ 07 октября 2009

У меня есть приложение Rails, которое получает поражение от ScanAlert, вызывая /login.php, но приложение выдает 500. Я хотел бы отфильтровать любой формат, который не поддерживается моим сайтом, и 404 вместо этого.

Моя первоначальная склонность заключалась в создании before_filter в application_controller.rb, который удаляет любой: формат, который не является: html,: xml или: js, затем рендерит 404.

Однако было бы лучше отлавливать неподдерживаемые форматы на уровне маршрутизации. Кто-нибудь подходил к этому так и что вы положили в файл маршрутов?

Казалось бы, это общая проблема, но я не смог найти решения.

Ответы [ 3 ]

1 голос
/ 07 октября 2009

Простое сопоставление маршрута с несуществующим действием должно вернуть 404.

Попробуйте добавить это к вашему routes.rb:

map.connect '/login.php', :controller => 'application', :action => 'devnull'

Для более общего решения добавьте это в конец всех маршрутов (делать это аккуратно для читателя (подсказка: with_options)):

:conditions => {:format => /js|html|xml/}

или с другой стороны:

map.connect '/*whocares.php', :controller => 'application', :action => 'devnull' 
0 голосов
/ 06 ноября 2009

Если вы используете отдыхающие маршруты, вы должны использовать

respond_to do |format|
  format.html 
end

это вернет 401 (я думаю), это не ошибка, которая будет появляться в ваших журналах, а вместо этого «нераспознанный формат» (хотя я могу ошибаться в точном коде и сообщении). В любом случае, он не требует специальной конфигурации в ваших маршрутах или настройках Apache, а вместо этого использует соглашение о конфигурации.

Если ваши маршруты не успокаиваются, тогда вы должны добавить формат:: в конце маршрута, чтобы он работал, например.

map.login '/login.:format', :controller => 'application', :action => 'login'

Также, быстрое примечание, старайтесь не использовать map.connect, вместо этого используйте именованные маршруты, поскольку они более чистые и передают смысл, выражая то, что на самом деле делает маршрут, особенно в ваших представлениях. (login_path говорит намного больше и чище, чем его кузен { :controller => 'application', :action => 'login' })

Надеюсь, это поможет.

0 голосов
/ 06 ноября 2009

Если это один и тот же URL снова и снова, возможно, стоит добавить правило перезаписи Apache на вашем производственном сервере, чтобы отобразить URL на страницу 404, чтобы она никогда не касалась Ruby. Руководство по переписыванию Apache

...