すでに問題を解決していますが、これを代替として追加することもできます。完全なカスタムアクセプタを作成したくない場合はHUNCHENTOOT:ACCEPTOR-DISPATCH-REQUEST
にaround-methodをHUNCHENTOOT:EASY-HANDLER
として追加することができます。
は、まずはアクセプタ1ページを作ってみましょう:
(defparameter *acceptor* (make-instance 'hunchentoot:easy-acceptor :port 4242))
(hunchentoot:define-easy-handler (foo :uri "/foo")()
(format nil "<html><body><h1>Test</h1><p>foo</p></body></html>"))
(hunchentoot:start *acceptor*)
その後/foo
に/bar
と/quux
をリダイレクト:
;; A simple helper to create prefix dispatchers.
(defun make-redirect-list (redirects)
(mapcar (lambda (redirect)
(destructuring-bind (from . to) redirect
(hunchentoot:create-prefix-dispatcher from
(lambda()
(hunchentoot:redirect to)))))
redirects))
(defparameter *redirects* (make-redirect-list
'(("/bar" . "/foo")
("/quux" . "/foo"))))
(defmethod hunchentoot:acceptor-dispatch-request :around
((acceptor hunchentoot:easy-acceptor) request)
(dolist (redirect *redirects*)
;; Match the request against the prefix dispatchers in *REDIRECTS*...
(let ((handler (funcall redirect request)))
(when handler
;; and call the corresponding handler if a match is found.
(return-from hunchentoot:acceptor-dispatch-request
(funcall handler)))))
;; Unless a handler was found, call next method to
;; handle the request normally.
(call-next-method))
編集:前の方法を中心に使用してください代わりに。私は最初に、メインのメソッドを通常はどのようなロギングにも必要になると考えていました。そこで起きているが、それ以上のテストの後ではそうではないようだ。
ハンドラを使用する代わりに、[カスタムアクセプタ](http://weitz.de/hunchentoot/#acceptor-behaviour)の作成を検討してください。そうすれば、どんな方法ででもリダイレクトを行うことができます。 – jkiiski
ありがとう@jkiiski。あなたの提案は、私がやったやり方よりも良い解決策のように思えます。私はこのような解決策をいつか実現するのに十分なスキルを得ることを切望しています。 – SpyroSoft