プログラムで、サブディレクトリにアプリケーションを配置することを検証してみました。
Railsのような機能を使えるか
なお、Railsの場合、以下の方法でできるそうです。(以下が私のやりたいことです)
Expressにはそのような機能はありません(多分)
あったとしても、今回はその方法は使えない
と思います。
使えない理由は、
crowiは、HTMLに直接パスを書いてあり、サブディレクトリを変更しても、ページが変更されないからです。(以下参照)
html
1<ul class="nav nav-tabs">
2 <li><a href="/me"><i class="fa fa-gears"></i> {{ t('User Information') }}</a></li>
3 <li><a href="/me/password"><i class="fa fa-key"></i> {{ t('Password Setting') }}</a></li>
4 <li class="active"><a href="/me/apiToken"><i class="fa fa-rocket"></i> {{ t('API Settings') }}</a></li>
5</ul>
サブディレクトリにアプリケーションを配置してみる
よって、サブディレクトリにアプリケーションを配置するには、気合of気合
ですべてのパスを変更するしかないと考えます。
プログラムを読んでいくと、crowi/lib/routes/index.jsに次のような記述があります。
ここのプログラムは、ルーティングの設定を行っています。
javascript
1app.get('/' , loginRequired(crowi, app) , page.pageListShow);
2
3app.get('/installer' , middleware.applicationNotInstalled() , installer.index);
4app.post('/installer/createAdmin' , middleware.applicationNotInstalled() , form.register , csrf, installer.createAdmin);
5//app.post('/installer/user' , middleware.applicationNotInstalled() , installer.createFirstUser);
6
7app.get('/login/error/:reason' , login.error);
8
9//以下省略
これを気合
で次のように変更します。
shell
1sed -i -e "s/app\.post('\//app\.post('\/crowi\//g" -e "s/app\.get('\//app\.get('\/crowi\//g" lib/routes/index.js
javascript
1app.get('/crowi/' , loginRequired(crowi, app) , page.pageListShow);
2
3app.get('/crowi/installer' , middleware.applicationNotInstalled() , installer.index);
4app.post('/crowi/installer/createAdmin' , middleware.applicationNotInstalled() , form.register , csrf, installer.createAdmin);
5//app.post('/crowi/installer/user' , middleware.applicationNotInstalled() , installer.createFirstUser);
6
7app.get('/crowi/login/error/:reason' , login.error);
8
9//以下省略
これで、cssやhtmlの配置がきれいに見えるようになるのですが、リダイレクトを用いたページ遷移がうまいこと動きません。(非ログイン状態ならログインページにリダイレクト等)
リダイレクトを行っている部分は、次の部分(一部抜粋)です。
javascript
1// ログイン済みならさようなら
2if (req.user) {
3 return res.redirect('/');
4}
5
6// config で closed ならさよなら
7if (config.crowi['security:registrationMode'] == Config.SECURITY_REGISTRATION_MODE_CLOSED) {
8 return res.redirect('/');
9}
これも、気合
で変更します。
shell
1sed -i -e "s/return res\.redirect('\//return res\.redirect('\/crowi\//g" lib/routes/logout.js
2sed -i -e "s/return res\.redirect('\//return res\.redirect('\/crowi\//g" lib/routes/login.js
3sed -i -e "s/return res\.redirect('\//return res\.redirect('\/crowi\//g" lib/routes/me.js
4sed -i -e "s/return res\.redirect('\//return res\.redirect('\/crowi\//g" lib/routes/admin.js
5sed -i -e "s/return res\.redirect('\//return res\.redirect('\/crowi\//g" lib/util/middlewares.js
6sed -i -e "s/return res\.redirect('\//return res\.redirect('\/crowi\//g" lib/routes/installer.js
javascript
1// ログイン済みならさようなら
2if (req.user) {
3 return res.redirect('/crowi/');
4}
5
6// config で closed ならさよなら
7if (config.crowi['security:registrationMode'] == Config.SECURITY_REGISTRATION_MODE_CLOSED) {
8 return res.redirect('/crowi/');
9}
これで、いい感じにリダイレクトできるのですが、FormのPOST先のパスを変えないといけません。
POST先を指定しているのは、以下の部分です(一部抜粋)
html
1<form role="form" action="/admin/user/invite" method="post">
2 <div id="inviteUserForm" class="collapse">
3 {% if sUser.status == 1 %}
4 <form action="/admin/user/{{ sUser._id.toString() }}/activate" method="post">
これを気合
で変更します。
shell
1sed -i -e "s/action=\"\//action=\"\/crowi\//g" lib/views/admin/users.html
2sed -i -e "s/action=\"\//action=\"\/crowi\//g" lib/views/me/index.html
3sed -i -e "s/action=\"\//action=\"\/crowi\//g" lib/views/admin/search.html
4sed -i -e "s/action=\"\//action=\"\/crowi\//g" lib/views/login.html
5sed -i -e "s/action=\"\//action=\"\/crowi\//g" lib/views/admin/app.html
6sed -i -e "s/action=\"\//action=\"\/crowi\//g" lib/views/me/api_token.html
7sed -i -e "s/action=\"\//action=\"\/crowi\//g" resource/js/components/HeaderSearchBox/SearchForm.js
8sed -i -e "s/action=\"\//action=\"\/crowi\//g" lib/views/_form.html
9sed -i -e "s/action=\"\//action=\"\/crowi\//g" lib/views/installer.html
10sed -i -e "s/action=\"\//action=\"\/crowi\//g" lib/views/invited.html
11sed -i -e "s/action=\"\//action=\"\/crowi\//g" lib/views/me/password.html
12sed -i -e "s/action=\"\//action=\"\/crowi\//g" lib/views/admin/notification.html
html
1<form role="form" action="/crowi/admin/user/invite" method="post">
2 <div id="inviteUserForm" class="collapse">
3 {% if sUser.status == 1 %}
4 <form action="/crowi/admin/user/{{ sUser._id.toString() }}/activate" method="post">
と、言う感じで aタグのherf
, scriptタグのsrc
等を気合
で変更すれば、動くと思います。
まとめ
気合of気合
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/16 01:13