From 600b23c0a40a4453532d20c1a53ce426ae8e3e68 Mon Sep 17 00:00:00 2001 From: Neil Lalonde Date: Tue, 4 Oct 2016 12:01:42 -0400 Subject: [PATCH] FIX: permalink redirects should work on tag paths --- app/controllers/application_controller.rb | 19 +++++++++++++++++++ app/controllers/list_controller.rb | 23 ++--------------------- app/controllers/tags_controller.rb | 8 ++++---- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index ed040589e28..d9b6e5e6015 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -329,6 +329,25 @@ class ApplicationController < ActionController::Base request.session_options[:skip] = true end + def permalink_redirect_or_not_found + url = request.fullpath + permalink = Permalink.find_by_url(url) + + if permalink.present? + # permalink present, redirect to that URL + if permalink.external_url + redirect_to permalink.external_url, status: :moved_permanently + elsif permalink.target_url + redirect_to "#{Discourse::base_uri}#{permalink.target_url}", status: :moved_permanently + else + raise Discourse::NotFound + end + else + # redirect to 404 + raise Discourse::NotFound + end + end + private def locale_from_header diff --git a/app/controllers/list_controller.rb b/app/controllers/list_controller.rb index b3bc5d19310..e680ce8d683 100644 --- a/app/controllers/list_controller.rb +++ b/app/controllers/list_controller.rb @@ -259,7 +259,7 @@ class ListController < ApplicationController parent_category_id = nil if parent_slug_or_id.present? parent_category_id = Category.query_parent_category(parent_slug_or_id) - redirect_or_not_found and return if parent_category_id.blank? && !id + permalink_redirect_or_not_found and return if parent_category_id.blank? && !id end @category = Category.query_category(slug_or_id, parent_category_id) @@ -270,7 +270,7 @@ class ListController < ApplicationController (redirect_to category.url, status: 301) && return if category end - redirect_or_not_found and return if !@category + permalink_redirect_or_not_found and return if !@category @description_meta = @category.description_text raise Discourse::NotFound unless guardian.can_see?(@category) @@ -349,23 +349,4 @@ class ListController < ApplicationController periods end - def redirect_or_not_found - url = request.fullpath - permalink = Permalink.find_by_url(url) - - if permalink.present? - # permalink present, redirect to that URL - if permalink.external_url - redirect_to permalink.external_url, status: :moved_permanently - elsif permalink.target_url - redirect_to "#{Discourse::base_uri}#{permalink.target_url}", status: :moved_permanently - else - raise Discourse::NotFound - end - else - # redirect to 404 - raise Discourse::NotFound - end - end - end diff --git a/app/controllers/tags_controller.rb b/app/controllers/tags_controller.rb index 87412084de8..71d434d8b8e 100644 --- a/app/controllers/tags_controller.rb +++ b/app/controllers/tags_controller.rb @@ -78,7 +78,7 @@ class TagsController < ::ApplicationController canonical_url "#{Discourse.base_url_no_prefix}#{public_send(url_method(params.slice(:category, :parent_category)))}" if @list.topics.size == 0 && params[:tag_id] != 'none' && !Tag.where(name: @tag_id).exists? - raise Discourse::NotFound + permalink_redirect_or_not_found else respond_with_list(@list) end @@ -220,13 +220,13 @@ class TagsController < ::ApplicationController parent_category_id = nil if parent_slug_or_id.present? parent_category_id = Category.query_parent_category(parent_slug_or_id) - redirect_or_not_found and return if parent_category_id.blank? + category_redirect_or_not_found and return if parent_category_id.blank? end @filter_on_category = Category.query_category(slug_or_id, parent_category_id) end - redirect_or_not_found and return if !@filter_on_category + category_redirect_or_not_found and return if !@filter_on_category guardian.ensure_can_see!(@filter_on_category) end @@ -305,7 +305,7 @@ class TagsController < ::ApplicationController options end - def redirect_or_not_found + def category_redirect_or_not_found # automatic redirects for renamed categories url = params[:parent_category] ? "c/#{params[:parent_category]}/#{params[:category]}" : "c/#{params[:category]}" permalink = Permalink.find_by_url(url)