Ruby-on-rails: كيفية التخلص من صفحة "ك يتم إعادة توجيهها "
-
29-09-2019 - |
سؤال
أنا أتجاوز استجابة الفشل في Inpise حتى أتمكن من تعيين رمز الحالة 401. ومع ذلك ، عندما يفشل المستخدم في تسجيل الدخول ، يتم إعادة توجيهه إلى صفحة مع رابط "يتم إعادة توجيهك". إذا قمت بإزالة هذا :status => 401
من إعادة التوجيه يعمل بشكل جيد.
class CustomFailure < Devise::FailureApp
def redirect_url
new_user_session_url(:subdomain => 'secure')
end
def respond
if http_auth?
http_auth
else
store_location!
flash[:alert] = i18n_message unless flash[:notice]
redirect_to redirect_url, :status => 401
end
end
end
تعديل
بدلاً من ذلك ، أود أن أعرض رسالة الفلاش والبقاء على نفس الصفحة ولكن إضافة هذا السطر من التعليمات البرمجية:
render :text => "unauthorized", :status => 401
يسبب روبي للشكوى:
undefined method `render' for #<CustomFailure:0x00000103367f28>
ماذا يحصل هنا؟
المحلول
تكون حالات HTTP المناسبة لإعادة التوجيه في شكل 30x (301 و 302 كونها الأكثر استخدامًا). بشكل افتراضي ، يقوم المساعد Redirect_to بتعيين رأس حالة 302 على استجابة HTTP. إذا قمت بتجاوز ذلك وقمت بتعيين ذلك على 401 ، فستفترض متصفح الويب الخاص بك أن الاستجابة عبارة عن صفحة ويب عادية وستجعل هيئة الاستجابة -والتي ، في إعادة التوجيه ، هي نص Boilerplate "يتم إعادة توجيهك".
نصائح أخرى
كنت فعليًا في هذه المشكلة على خادم QA الخاص بنا ، ولكن ليس محليًا. اتضح أن memcache الخاص بنا كان يعترض الرسالة ويجعلها على أنها 200 ، وتسبب في ظهور هذه الرسالة. كان هذا يرجع بشكل غير مباشر إلى إعدادات Memcache الخاصة بنا والتي لم تتوقع إعادة توجيه من GET.
From:
$document_root/cache/$uri.html /cache/$uri /cache/$uri.html $uri @memcached
To:
$document_root/cache/$uri.html /cache/$uri /cache/$uri.html $uri @rails
كما قال pantulis سيعرض المتصفح هذه الرسالة القياسية إذا لم يكن رمز الاستجابة 3xx
لتتغير هذا ، يمكنك إجراء إعادة توجيه JavaScript:
# example with status 500:
render text: "<script>window.location = '#{url}';</script>", status: 500
هذا أمر صالح خارج الدورة فقط إذا كنت متأكدًا من أن جميع المستخدمين يستخدمون JavaScript. إذا كان من الممكن تصفح التطبيق الخاص بك من قبل المستخدمين الذين قد يكون لديهم تعطيل JavaScript ، فيجب عليك أيضًا تضمين أ noscript
علامة ورد في رسالة "أنت إعادة توجيه" القياسية
عندما أواجه هذه المشكلة ، فإن ما فعلته في الماضي هو شيء من هذا القبيل:
#app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
after_filter :check_page_content
...
private
def check_page_content
if response.body.include? "You are being"
html_doc = Nokogiri::HTML(response.body)
uri = html_doc.css('a').map { |link| link['href'] }.first
response.body = "<script>
window.location.replace('#{uri}');
</script>"
end
end
end
ما أقوم به هو التحقق من معرفة ما إذا كان محتوى الصفحة هو "أنت". إذا كان هذا صحيحًا ، فأنا أعلم أنني لست حيث أريد أن أكون. وأنا فقط أقوم بتحديث الصفحة إلى حيث أريد حقًا أن أكون ببعض المساعدة من JavaScript. أعلم أنه ليس الحل الأكثر أناقة ولكنه يساعد حقًا
اختراق سعيد