mirror of
https://github.com/discourse/discourse.git
synced 2025-05-21 18:12:32 +08:00
FIX: check permalinks for deleted topics
- allow to specify 410 vs 404 in Discourse::NotFound exception - remove unused `permalink_redirect_or_not_found` which - handle JS side links to topics via Discourse-Xhr-Redirect mechanism
This commit is contained in:
@ -173,7 +173,16 @@ class ApplicationController < ActionController::Base
|
||||
end
|
||||
end
|
||||
|
||||
rescue_from Discourse::NotFound, PluginDisabled, ActionController::RoutingError do
|
||||
rescue_from Discourse::NotFound do |e|
|
||||
rescue_discourse_actions(
|
||||
:not_found,
|
||||
e.status,
|
||||
check_permalinks: e.check_permalinks,
|
||||
original_path: e.original_path
|
||||
)
|
||||
end
|
||||
|
||||
rescue_from PluginDisabled, ActionController::RoutingError do
|
||||
rescue_discourse_actions(:not_found, 404)
|
||||
end
|
||||
|
||||
@ -194,12 +203,37 @@ class ApplicationController < ActionController::Base
|
||||
render_json_error I18n.t('read_only_mode_enabled'), type: :read_only, status: 503
|
||||
end
|
||||
|
||||
def redirect_with_client_support(url, options)
|
||||
if request.xhr?
|
||||
response.headers['Discourse-Xhr-Redirect'] = 'true'
|
||||
render plain: url
|
||||
else
|
||||
redirect_to url, options
|
||||
end
|
||||
end
|
||||
|
||||
def rescue_discourse_actions(type, status_code, opts = nil)
|
||||
opts ||= {}
|
||||
show_json_errors = (request.format && request.format.json?) ||
|
||||
(request.xhr?) ||
|
||||
((params[:external_id] || '').ends_with? '.json')
|
||||
|
||||
if type == :not_found && opts[:check_permalinks]
|
||||
url = opts[:original_path] || request.fullpath
|
||||
permalink = Permalink.find_by_url(url)
|
||||
|
||||
if permalink.present?
|
||||
# permalink present, redirect to that URL
|
||||
if permalink.external_url
|
||||
redirect_with_client_support permalink.external_url, status: :moved_permanently
|
||||
return
|
||||
elsif permalink.target_url
|
||||
redirect_with_client_support "#{Discourse::base_uri}#{permalink.target_url}", status: :moved_permanently
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
message = opts[:custom_message_translated] || I18n.t(opts[:custom_message] || type)
|
||||
|
||||
if show_json_errors
|
||||
@ -444,25 +478,6 @@ 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
|
||||
|
||||
def secure_session
|
||||
SecureSession.new(session["secure_session_id"] ||= SecureRandom.hex)
|
||||
end
|
||||
|
Reference in New Issue
Block a user