###############################################################################
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
###############################################################################
####
# OFBiz Global URL Settings - WebSite specific settings found in WebSite entity
####

# HTTPS Port (Secure port)
port.https.enabled=Y
port.https=8443
force.https.host=

# HTTP Port (Not Secure port)
port.http=8080
force.http.host=

# If you want to use HTTP then set no.http=N. Else all requests will use HTTPS except if put in the http.request-map.list  
no.http=Y
http.request-map.list=SOAPService,xmlrpc

# Static Content URLs to make it easy to move the serving load for static content to other machines
# -- thse are for general content such as images, js & css files, or non-dynamic HTML files
content.url.prefix.secure=
content.url.prefix.standard=

# Here you can set the domain string to use for new cookies
cookie.domain=

# Exclude jsessionid for User-Agents (separated by comma's)
link.remove_lsessionid.user_agent_list = googlebot,yahoo,msnbot,mediapartners-google

# Should HTTP parameters sent to services require encryption?
# This is generally advised for more secure webapps as it makes it more difficult to spoof requests (XSRF) that change data. 
service.http.parameters.require.encrypted=Y

# FOP configurable folder
fop.path=component://webapp/config
# Font path for FOP
fop.font.base.path=component://webapp/config/

