diff --git a/src/main/java/org/codelibs/fess/app/web/RootAction.java b/src/main/java/org/codelibs/fess/app/web/RootAction.java
index 889b26eea..cde31a020 100644
--- a/src/main/java/org/codelibs/fess/app/web/RootAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/RootAction.java
@@ -40,7 +40,7 @@ public class RootAction extends FessSearchAction {
return redirectToLogin();
}
- return asHtml(path_IndexJsp).useForm(SearchForm.class, op -> {
+ return asHtml(virtualHost(path_IndexJsp)).useForm(SearchForm.class, op -> {
op.setup(form -> {
buildFormParams(form);
});
diff --git a/src/main/java/org/codelibs/fess/app/web/base/FessLoginAction.java b/src/main/java/org/codelibs/fess/app/web/base/FessLoginAction.java
index c248aee20..d735554f8 100644
--- a/src/main/java/org/codelibs/fess/app/web/base/FessLoginAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/base/FessLoginAction.java
@@ -21,7 +21,7 @@ import org.lastaflute.web.response.HtmlResponse;
public abstract class FessLoginAction extends FessSearchAction {
protected HtmlResponse getHtmlResponse() {
- return getUserBean().map(user -> redirectByUser(user)).orElse(asHtml(path_Login_IndexJsp));
+ return getUserBean().map(user -> redirectByUser(user)).orElse(asHtml(virtualHost(path_Login_IndexJsp)));
}
protected HtmlResponse redirectByUser(final FessUserBean user) {
diff --git a/src/main/java/org/codelibs/fess/app/web/base/FessSearchAction.java b/src/main/java/org/codelibs/fess/app/web/base/FessSearchAction.java
index 80f20b437..2c93e6082 100644
--- a/src/main/java/org/codelibs/fess/app/web/base/FessSearchAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/base/FessSearchAction.java
@@ -46,6 +46,7 @@ import org.dbflute.optional.OptionalThing;
import org.lastaflute.web.login.LoginManager;
import org.lastaflute.web.response.ActionResponse;
import org.lastaflute.web.response.HtmlResponse;
+import org.lastaflute.web.response.next.HtmlNext;
import org.lastaflute.web.ruts.process.ActionRuntime;
public abstract class FessSearchAction extends FessBaseAction {
@@ -220,4 +221,8 @@ public abstract class FessSearchAction extends FessBaseAction {
final String contextPath = request.getServletContext().getContextPath();
return newHtmlResponseAsRediect(StringUtil.isBlank(contextPath) ? "/" : contextPath);
}
+
+ protected HtmlNext virtualHost(HtmlNext path) {
+ return fessConfig.getVirtualHostPath(path);
+ }
}
diff --git a/src/main/java/org/codelibs/fess/app/web/cache/CacheAction.java b/src/main/java/org/codelibs/fess/app/web/cache/CacheAction.java
index d5607de9d..556c0aa08 100644
--- a/src/main/java/org/codelibs/fess/app/web/cache/CacheAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/cache/CacheAction.java
@@ -47,7 +47,7 @@ public class CacheAction extends FessSearchAction {
// ==============
@Execute
public ActionResponse index(final CacheForm form) {
- validate(form, messages -> {}, () -> asHtml(path_Error_ErrorJsp));
+ validate(form, messages -> {}, () -> asHtml(virtualHost(path_Error_ErrorJsp)));
if (isLoginRequired()) {
return redirectToLogin();
}
diff --git a/src/main/java/org/codelibs/fess/app/web/error/ErrorAction.java b/src/main/java/org/codelibs/fess/app/web/error/ErrorAction.java
index 45b14d41a..b0f962126 100644
--- a/src/main/java/org/codelibs/fess/app/web/error/ErrorAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/error/ErrorAction.java
@@ -34,6 +34,6 @@ public class ErrorAction extends FessSearchAction {
// ==============
@Execute
public HtmlResponse index(final ErrorForm form) {
- return asHtml(path_Error_ErrorJsp);
+ return asHtml(virtualHost(path_Error_ErrorJsp));
}
}
\ No newline at end of file
diff --git a/src/main/java/org/codelibs/fess/app/web/error/ErrorBadrequrestAction.java b/src/main/java/org/codelibs/fess/app/web/error/ErrorBadrequrestAction.java
index 71f7a75e8..b077365f3 100644
--- a/src/main/java/org/codelibs/fess/app/web/error/ErrorBadrequrestAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/error/ErrorBadrequrestAction.java
@@ -35,6 +35,6 @@ public class ErrorBadrequrestAction extends FessSearchAction {
@Execute
public HtmlResponse index(final ErrorForm form) {
- return asHtml(path_Error_BadRequestJsp);
+ return asHtml(virtualHost(path_Error_BadRequestJsp));
}
}
\ No newline at end of file
diff --git a/src/main/java/org/codelibs/fess/app/web/error/ErrorNotfoundAction.java b/src/main/java/org/codelibs/fess/app/web/error/ErrorNotfoundAction.java
index 1add65c29..c179111f2 100644
--- a/src/main/java/org/codelibs/fess/app/web/error/ErrorNotfoundAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/error/ErrorNotfoundAction.java
@@ -35,6 +35,6 @@ public class ErrorNotfoundAction extends FessSearchAction {
@Execute
public HtmlResponse index(final ErrorForm form) {
- return asHtml(path_Error_NotFoundJsp);
+ return asHtml(virtualHost(path_Error_NotFoundJsp));
}
}
\ No newline at end of file
diff --git a/src/main/java/org/codelibs/fess/app/web/error/ErrorSystemerrorAction.java b/src/main/java/org/codelibs/fess/app/web/error/ErrorSystemerrorAction.java
index 1a3a7e1a9..e01095da2 100644
--- a/src/main/java/org/codelibs/fess/app/web/error/ErrorSystemerrorAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/error/ErrorSystemerrorAction.java
@@ -35,6 +35,6 @@ public class ErrorSystemerrorAction extends FessSearchAction {
@Execute
public HtmlResponse index(final ErrorForm form) {
- return asHtml(path_Error_SystemJsp);
+ return asHtml(virtualHost(path_Error_SystemJsp));
}
}
\ No newline at end of file
diff --git a/src/main/java/org/codelibs/fess/app/web/go/GoAction.java b/src/main/java/org/codelibs/fess/app/web/go/GoAction.java
index 5600764c7..e533adc4e 100644
--- a/src/main/java/org/codelibs/fess/app/web/go/GoAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/go/GoAction.java
@@ -67,7 +67,7 @@ public class GoAction extends FessSearchAction {
// ==============
@Execute
public ActionResponse index(final GoForm form) throws IOException {
- validate(form, messages -> {}, () -> asHtml(path_Error_ErrorJsp));
+ validate(form, messages -> {}, () -> asHtml(virtualHost(path_Error_ErrorJsp)));
if (isLoginRequired()) {
return redirectToLogin();
}
diff --git a/src/main/java/org/codelibs/fess/app/web/help/HelpAction.java b/src/main/java/org/codelibs/fess/app/web/help/HelpAction.java
index 693287c75..7218b2c78 100644
--- a/src/main/java/org/codelibs/fess/app/web/help/HelpAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/help/HelpAction.java
@@ -45,7 +45,7 @@ public class HelpAction extends FessSearchAction {
return redirectToLogin();
}
- return asHtml(path_HelpJsp).useForm(SearchForm.class, op -> {
+ return asHtml(virtualHost(path_HelpJsp)).useForm(SearchForm.class, op -> {
op.setup(form -> {
buildFormParams(form);
});
diff --git a/src/main/java/org/codelibs/fess/app/web/login/LoginAction.java b/src/main/java/org/codelibs/fess/app/web/login/LoginAction.java
index 3bef4473c..c170ccebc 100644
--- a/src/main/java/org/codelibs/fess/app/web/login/LoginAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/login/LoginAction.java
@@ -37,7 +37,7 @@ public class LoginAction extends FessLoginAction {
if (form != null) {
form.clearSecurityInfo();
}
- return asHtml(path_Login_IndexJsp).renderWith(data -> {
+ return asHtml(virtualHost(path_Login_IndexJsp)).renderWith(data -> {
RenderDataUtil.register(data, "notification", fessConfig.getNotificationLogin());
saveToken();
});
diff --git a/src/main/java/org/codelibs/fess/app/web/profile/ProfileAction.java b/src/main/java/org/codelibs/fess/app/web/profile/ProfileAction.java
index a5c76b326..0d3679cf3 100644
--- a/src/main/java/org/codelibs/fess/app/web/profile/ProfileAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/profile/ProfileAction.java
@@ -96,7 +96,7 @@ public class ProfileAction extends FessSearchAction {
}
protected HtmlResponse asIndexHtml() {
- return getUserBean().map(u -> asHtml(path_Profile_IndexJsp).useForm(ProfileForm.class))
- .orElseGet(() -> redirect(LoginAction.class));
+ return getUserBean().map(u -> asHtml(virtualHost(path_Profile_IndexJsp)).useForm(ProfileForm.class)).orElseGet(
+ () -> redirect(LoginAction.class));
}
}
diff --git a/src/main/java/org/codelibs/fess/app/web/search/SearchAction.java b/src/main/java/org/codelibs/fess/app/web/search/SearchAction.java
index 7d5d35aff..e01b31cda 100644
--- a/src/main/java/org/codelibs/fess/app/web/search/SearchAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/search/SearchAction.java
@@ -98,7 +98,7 @@ public class SearchAction extends FessSearchAction {
}
protected HtmlResponse doSearch(final SearchForm form) {
- validate(form, messages -> {}, () -> asHtml(path_SearchJsp));
+ validate(form, messages -> {}, () -> asHtml(virtualHost(path_SearchJsp)));
if (isLoginRequired()) {
return redirectToLogin();
}
@@ -126,7 +126,7 @@ public class SearchAction extends FessSearchAction {
request.setAttribute(Constants.REQUEST_QUERIES, form.q);
final WebRenderData renderData = new WebRenderData();
searchService.search(form, renderData, getUserBean());
- return asHtml(path_SearchJsp).renderWith(data -> {
+ return asHtml(virtualHost(path_SearchJsp)).renderWith(data -> {
renderData.register(data);
// favorite or thumbnail
if (favoriteSupport || thumbnailSupport) {
diff --git a/src/main/java/org/codelibs/fess/app/web/thumbnail/ThumbnailAction.java b/src/main/java/org/codelibs/fess/app/web/thumbnail/ThumbnailAction.java
index 00326ff37..666ac6f80 100644
--- a/src/main/java/org/codelibs/fess/app/web/thumbnail/ThumbnailAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/thumbnail/ThumbnailAction.java
@@ -46,7 +46,7 @@ public class ThumbnailAction extends FessSearchAction {
// ==============
@Execute
public ActionResponse index(final ThumbnailForm form) {
- validate(form, messages -> {}, () -> asHtml(path_Error_ErrorJsp));
+ validate(form, messages -> {}, () -> asHtml(virtualHost(path_Error_ErrorJsp)));
if (isLoginRequired()) {
return redirectToLogin();
}
diff --git a/src/main/java/org/codelibs/fess/mylasta/direction/FessConfig.java b/src/main/java/org/codelibs/fess/mylasta/direction/FessConfig.java
index 8dd1e076e..e9a780497 100644
--- a/src/main/java/org/codelibs/fess/mylasta/direction/FessConfig.java
+++ b/src/main/java/org/codelibs/fess/mylasta/direction/FessConfig.java
@@ -136,6 +136,9 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction
/** The key of the configuration. e.g. Radmin-api */
String API_ADMIN_ACCESS_PERMISSIONS = "api.admin.access.permissions";
+ /** The key of the configuration. e.g. */
+ String VIRTUAL_HOST_HEADERS = "virtual.host.headers";
+
/** The key of the configuration. e.g. 50 */
String CRAWLER_DOCUMENT_MAX_SITE_LENGTH = "crawler.document.max.site.length";
@@ -1445,6 +1448,21 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction
*/
String getApiAdminAccessPermissions();
+ /**
+ * Get the value for the key 'virtual.host.headers'.
+ * The value is, e.g.
+ * @return The value of found property. (NotNull: if not found, exception but basically no way)
+ */
+ String getVirtualHostHeaders();
+
+ /**
+ * Get the value for the key 'virtual.host.headers' as {@link Integer}.
+ * The value is, e.g.
+ * @return The value of found property. (NotNull: if not found, exception but basically no way)
+ * @throws NumberFormatException When the property is not integer.
+ */
+ Integer getVirtualHostHeadersAsInteger();
+
/**
* Get the value for the key 'crawler.document.max.site.length'.
* The value is, e.g. 50
@@ -4963,6 +4981,14 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction
return get(FessConfig.API_ADMIN_ACCESS_PERMISSIONS);
}
+ public String getVirtualHostHeaders() {
+ return get(FessConfig.VIRTUAL_HOST_HEADERS);
+ }
+
+ public Integer getVirtualHostHeadersAsInteger() {
+ return getAsInteger(FessConfig.VIRTUAL_HOST_HEADERS);
+ }
+
public String getCrawlerDocumentMaxSiteLength() {
return get(FessConfig.CRAWLER_DOCUMENT_MAX_SITE_LENGTH);
}
diff --git a/src/main/java/org/codelibs/fess/mylasta/direction/FessProp.java b/src/main/java/org/codelibs/fess/mylasta/direction/FessProp.java
index f6bcdfda1..831702bc1 100644
--- a/src/main/java/org/codelibs/fess/mylasta/direction/FessProp.java
+++ b/src/main/java/org/codelibs/fess/mylasta/direction/FessProp.java
@@ -52,6 +52,7 @@ import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.lastaflute.job.LaJob;
import org.lastaflute.job.subsidiary.JobConcurrentExec;
+import org.lastaflute.web.response.next.HtmlNext;
import org.lastaflute.web.util.LaRequestUtil;
import org.lastaflute.web.validation.RequiredValidator;
import org.lastaflute.web.validation.theme.typed.DoubleTypeValidator;
@@ -61,6 +62,8 @@ import org.lastaflute.web.validation.theme.typed.LongTypeValidator;
public interface FessProp {
+ public static final String VIRTUAL_HOST_HEADERS = "virtualHostHeaders";
+
public static final String QUERY_COLLAPSE_INNER_HITS_SORTS = "queryCollapseInnerHitsSorts";
public static final String USER_CODE_PATTERN = "userCodePattern";
@@ -1552,4 +1555,33 @@ public interface FessProp {
return ot;
}
+ String getVirtualHostHeaders();
+
+ @SuppressWarnings("unchecked")
+ public default HtmlNext getVirtualHostPath(final HtmlNext page) {
+ Tuple3[] hosts = (Tuple3[]) propMap.get(VIRTUAL_HOST_HEADERS);
+ if (hosts == null) {
+ hosts = split(getVirtualHostHeaders(), "\n").get(stream -> stream.map(s -> {
+ final String[] v1 = s.split("=");
+ if (v1.length == 2) {
+ final String[] v2 = v1[0].split(":");
+ if (v2.length == 2) {
+ return new Tuple3(v2[0].trim(), v2[0].trim(), "/" + v1[1].trim());
+ }
+ }
+ return null;
+ }).filter(v -> v != null).toArray(n -> new Tuple3[n]));
+ propMap.put(VIRTUAL_HOST_HEADERS, hosts);
+ }
+ final Tuple3[] vHosts = hosts;
+ return LaRequestUtil.getOptionalRequest().map(req -> {
+ for (Tuple3 host : vHosts) {
+ final String headerValue = req.getHeader(host.getValue1());
+ if (host.getValue2().equalsIgnoreCase(headerValue)) {
+ return new HtmlNext(host.getValue3() + page.getRoutingPath());
+ }
+ }
+ return page;
+ }).orElse(page);
+ }
}
diff --git a/src/main/resources/fess_config.properties b/src/main/resources/fess_config.properties
index f70c7a87b..e8303c026 100644
--- a/src/main/resources/fess_config.properties
+++ b/src/main/resources/fess_config.properties
@@ -80,6 +80,9 @@ api.access.token.length=60
api.access.token.required=false
api.admin.access.permissions=Radmin-api
+# Virtual Host: Host:fess.codelibs.org=fess
+virtual.host.headers=
+
# ========================================================================================
# Index
# ====