force.com Sitesでは非SSLにおいて独自ドメインを設定できますが、SSLにおいては独自ドメインを適用できません。
force.com Sitesはポータル系のログイン画面やフォーム画面等で利用されることが多く
企業によっては「ドメインにforce.comとか入ってるのはダメ!」とか言われちゃったりします。
これ、リバースプロキシで出来るんじゃね?ということでちょっとやってみることに。
方法は簡単で、適当なWebサーバを用意してリバースプロキシの設定をするだけ。
以下はnginxの設定例
server {
listen 443;
server_name *******.com; #独自ドメイン
ssl on;
ssl_certificate server.crt;
ssl_certificate_key server.key;
ssl_session_timeout 5m;
ssl_protocols SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
ssl_prefer_server_ciphers on;
location / {
proxy_pass https://****-developer-edition.na7.force.com/; #SitesのベースURL
}
}
あとは設定したドメインにアクセスするだけ!
今回試したVFページ+Apexはこんな感じ
<apex:page controller="SitesTestPage" showHeader="true">
<script type="text/javascript">
var send = function() {
Visualforce.remoting.Manager.invokeAction(
'{!$RemoteAction.SitesTestPage.sendRA}',
function(result, event){
console.log(result);
},
{escape: true}
);
};
</script>
<apex:outputText value="{!display}" id="display"/>
<apex:form >
<apex:commandButton value="送信!" action="{!send}"/><br/>
<apex:commandButton value="送信!(ajax)" action="{!send}" reRender="display"/><br/>
username:<apex:inputText value="{!username}"/><br/>
password:<apex:inputSecret value="{!password}"/><br/>
<apex:commandButton value="login" action="{!login}"/>
</apex:form>
</apex:page>
public with sharing class SitesTestPage {
public String display { get; set; }
public String username {get; set;}
public String password {get; set;}
public SitesTestPage() {
this.display = 'Constructor!';
}
public PageReference send() {
this.display = 'Send!';
return null;
}
public PageReference login() {
return Site.login(this.username, this.password, null);
}
@RemoteAction
public static String sendRA() {
return 'aaa';
}
}
初期表示
うん、うまく表示されてます。JSエラーとかネットワークエラーも無し。
Sitesドメインと全く同じ表示になってます。
メソッド呼び出し
apex:commandButtonでメソッド呼び出してみます。いい感じ。apex:commandButton+reRenderでajaxもOKでした。
JavaScript Remotingしてみます。
これもOK。
じゃ、ログインしてみますか!
ダメでした。orz
POST先は独自ドメイン→Sitesドメインとフォワーディングしてくれてるんだけど
Site.loginはSitesのドメインのfrontdoor.jspが返却されるので
発行されるCookieはSitesドメインに対してなので楽勝でダメでした。そりゃそうだよねー。
っていうことで、ポータルへのログイン以外はなんとか機能しそうな感じです。
もちろん、絶対パスで指定しているようなajaxとかがあったら一発でアウトです。
ここらへんはSalesforceの仕様で簡単に変わるので、良い子は真似しないように!
ちなみに、Sitesのポータルへの接続を切るとこんな感じにCSSもちゃんと取ってこれてる様子がわかります。