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 # ====