2

ログイン ページを外部セキュリティ サービスにリダイレクトしようとしています。このサービスは、資格情報を検証した後、次の例のように、リファラー URL を使用してユーザーを元のページに戻します。

http://{IP NUMBER}/MyWiki/index.php?title=Special:UserLogin&returnto=Main_Page

または 、query_string にSpecial:UserLoginを含むサイト内のページへの呼び出しは、次の場所にリダイレクトする必要があります。

https://login.security.server.com/test/UI/Login?service=DSSEC&goto=http://{IP NUMBER}/MyWiki/index.php/Special:UserLogin

私は RewriteCond と RewriteRule を試してみましたが、うまくいきませんでした。

4

1 に答える 1

1

このようなものが欲しいですか?

RewriteEngine On
RewriteCond %{REQUEST_URI} Special:UserLogin [OR]
RewriteCond %{QUERY_STRING} Special:UserLogin
RewriteCond ?#%{QUERY_STRING} ([^#]+)#([^#]+)
RewriteRule ^ https://login.security.server.com/test/UI/Login?service=DSSEC&goto=http://%{SERVER_ADDR}%{REQUEST_URI}%1%2 [L,B,NE]

わかりました、これは少し混乱するように思えるでしょうが、ここで何が起こっているのかを説明します。

  1. Special:UserLoginがリクエスト URI またはクエリ文字列に含まれているかどうかを確認します。
  2. ?マーク、URI、およびクエリ文字列の後方参照の一致を作成します(これは非常に重要です)。
  3. リクエストを にリダイレクトしますhttps://login.security.server.com/test/UI/Loginが、前の条件からの後方参照を使用してパラメーターを作成し、後方参照を URL エンコードするフラグgoto=を使用します。Bこのようにして、結果は、UR​​L エンコードされたクエリ文字列を含む URL 全体になります。(NEフラグは、%標識自体が二重にエンコードされないようにするためにあります)。

これらのルールでは、次の要求があります。

/MyWiki/index.php?title=Special:UserLogin&returnto=Main_Page

次の場所にリダイレクトされます。

https://login.security.server.com/test/UI/Login?service=DSSEC&goto=http://123.45.67.89/MyWiki/index.php%3ftitle%3dSpecial%3aUserLogin%26returnto%3dMain_Page

ご覧のとおり、クエリ文字列?title=Special:UserLogin&returnto=Main_Pageは にエンコードされる%3ftitle%3dSpecial%3aUserLogin%26returnto%3dMain_Pageため、login.security.server.comはそれを独自のクエリ文字列と間違えません。代わりに、ログイン サービスは goto パラメータを次のように認識します。

http://123.45.67.89/MyWiki/index.php?title=Special:UserLogin&returnto=Main_Page

完全に無傷。

于 2012-08-30T20:08:19.783 に答える