CINXE.COM

farms:advanced [DokuWiki]

<!DOCTYPE html> <html lang="en" dir="ltr" class="no-js"> <head> <meta charset="utf-8" /> <title>farms:advanced [DokuWiki]</title> <meta name="generator" content="DokuWiki"/> <meta name="theme-color" content="#008800"/> <meta name="robots" content="index,follow"/> <meta name="keywords" content="farms,advanced"/> <link rel="search" type="application/opensearchdescription+xml" href="/lib/exe/opensearch.php" title="DokuWiki"/> <link rel="start" href="/"/> <link rel="contents" href="/farms:advanced?do=index" title="Sitemap"/> <link rel="manifest" href="/lib/exe/manifest.php"/> <link rel="alternate" type="application/rss+xml" title="Recent Changes" href="/feed.php"/> <link rel="alternate" type="application/rss+xml" title="Current namespace" href="/feed.php?mode=list&amp;ns=farms"/> <link rel="edit" title="Edit this page" href="/farms:advanced?do=edit"/> <link rel="alternate" type="text/html" title="Plain HTML" href="/_export/xhtml/farms:advanced"/> <link rel="alternate" type="text/plain" title="Wiki Markup" href="/_export/raw/farms:advanced"/> <link rel="canonical" href="https://www.dokuwiki.org/farms:advanced"/> <link rel="stylesheet" href="/lib/exe/css.php?t=dokuwiki&amp;tseed=f1005bad3d81fc9c803c7f93d32a390e"/> <link rel="alternate" hreflang="x-default" href="https://www.dokuwiki.org/farms:advanced"/> <script >var NS='farms';var JSINFO = {"plugins":{"edittable":{"default columnwidth":""}},"id":"farms:advanced","namespace":"farms","ACT":"show","useHeadingNavigation":0,"useHeadingContent":0};(function(H){H.className=H.className.replace(/\bno-js\b/,'js')})(document.documentElement);</script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.4/jquery.min.js" defer="defer"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.13.2/jquery-ui.min.js" defer="defer"></script> <script src="/lib/exe/js.php?t=dokuwiki&amp;tseed=f1005bad3d81fc9c803c7f93d32a390e&amp;lang=en" defer="defer"></script> <meta name="viewport" content="width=device-width,initial-scale=1" /> <link rel="shortcut icon" href="/lib/tpl/dokuwiki/images/favicon.ico" /> <link rel="apple-touch-icon" href="/lib/tpl/dokuwiki/images/apple-touch-icon.png" /> <meta name="verify-v1" content="OVxl3gsCv2MhZqh1cBQyl0JytWXSwXMjyvwc+4w3WtA=" /> <meta name="google-site-verification" content="YhTVK69hW94ZXUtc2zSLPxTkZKbZIn0zK67mz5WQB-E" /> <!-- Global site tag (gtag.js) - Google Analytics --> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-83791-1"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'UA-83791-1', { 'anonymize_ip': true }); </script> </head> <body> <div id="dokuwiki__site"><div id="dokuwiki__top" class="site dokuwiki mode_show tpl_dokuwiki showSidebar hasSidebar"> <!-- ********** HEADER ********** --> <header id="dokuwiki__header"><div class="pad group"> <div class="headings group"> <ul class="a11y skip"> <li><a href="#dokuwiki__content">skip to content</a></li> </ul> <h1 class="logo"><a href="/start" accesskey="h" title="Home [h]"><img src="/lib/tpl/dokuwiki/images/logo.png" width="64" height="64" alt="" /><span>DokuWiki</span></a></h1> <p class="claim">It's better when it's simple</p> </div> <div class="tools group"> <!-- USER TOOLS --> <div id="dokuwiki__usertools"> <h3 class="a11y">User Tools</h3> <ul> <li class="action login"><a href="/farms:advanced?do=login&amp;sectok=" title="Log In" rel="nofollow"><span>Log In</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M10 17.25V14H3v-4h7V6.75L15.25 12 10 17.25M8 2h9a2 2 0 0 1 2 2v16a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2v-4h2v4h9V4H8v4H6V4a2 2 0 0 1 2-2z"/></svg></a></li> </ul> </div> <!-- SITE TOOLS --> <div id="dokuwiki__sitetools"> <h3 class="a11y">Site Tools</h3> <form action="/start" method="get" role="search" class="search doku_form" id="dw__search" accept-charset="utf-8"><input type="hidden" name="do" value="search" /><input type="hidden" name="id" value="farms:advanced" /><div class="no"><input name="q" type="text" class="edit" title="[F]" accesskey="f" placeholder="Search" autocomplete="on" id="qsearch__in" value="" /><button value="1" type="submit" title="Search">Search</button><div id="qsearch__out" class="ajax_qsearch JSpopup"></div></div></form> <div class="mobileTools"> <form action="/doku.php" method="get" accept-charset="utf-8"><div class="no"><input type="hidden" name="id" value="farms:advanced" /><select name="do" class="edit quickselect" title="Tools"><option value="">Tools</option><optgroup label="Page Tools"><option value="edit">Edit this page</option><option value="revisions">Old revisions</option><option value="backlink">Backlinks</option></optgroup><optgroup label="Site Tools"><option value="recent">Recent Changes</option><option value="media">Media Manager</option><option value="index">Sitemap</option></optgroup><optgroup label="User Tools"><option value="login">Log In</option></optgroup></select><button type="submit">&gt;</button></div></form> </div> <ul> <li class="action recent"><a href="/farms:advanced?do=recent" title="Recent Changes [r]" rel="nofollow" accesskey="r">Recent Changes</a></li><li class="action media"><a href="/farms:advanced?do=media&amp;ns=farms" title="Media Manager" rel="nofollow">Media Manager</a></li><li class="action index"><a href="/farms:advanced?do=index" title="Sitemap [x]" rel="nofollow" accesskey="x">Sitemap</a></li> </ul> </div> </div> <!-- BREADCRUMBS --> <div class="breadcrumbs"> <div class="trace"><span class="bchead">Trace:</span> <span class="bcsep">•</span> <span class="curid"><bdi><a href="/farms:advanced" class="breadcrumbs" title="farms:advanced">advanced</a></bdi></span></div> </div> <hr class="a11y" /> </div></header><!-- /header --> <div class="wrapper group"> <!-- ********** ASIDE ********** --> <nav id="dokuwiki__aside" aria-label="Sidebar"><div class="pad aside include group"> <h3 class="toggle">Sidebar</h3> <div class="content"><div class="group"> <div class="plugin_translation is-dropdown"><span class="title">Translations of this page<sup><a href="/localization" class="wikilink1" title="localization" data-wiki-id="localization">?</a></sup>: </span><ul><li class="span"><span class="wikilink1" title="English">English (en)</span></li><li class="a"><a class="wikilink2" title="|العربية" href="/ar:farms:advanced">|العربية (ar)</a></li><li class="a"><a class="wikilink2" title="Català" href="/ca:farms:advanced">Català (ca)</a></li><li class="a"><a class="wikilink2" title="Česky" href="/cs:farms:advanced">Česky (cs)</a></li><li class="a"><a class="wikilink2" title="Dansk" href="/da:farms:advanced">Dansk (da)</a></li><li class="a"><a class="wikilink2" title="Deutsch" href="/de:farms:advanced">Deutsch (de)</a></li><li class="a"><a class="wikilink2" title="Ελληνικά" href="/el:farms:advanced">Ελληνικά (el)</a></li><li class="a"><a class="wikilink2" title="Esperanto" href="/eo:farms:advanced">Esperanto (eo)</a></li><li class="a"><a class="wikilink2" title="Español" href="/es:farms:advanced">Español (es)</a></li><li class="a"><a class="wikilink2" title="فارسی" href="/fa:farms:advanced">فارسی (fa)</a></li><li class="a"><a class="wikilink2" title="Français" href="/fr:farms:advanced">Français (fr)</a></li><li class="a"><a class="wikilink2" title="עברית" href="/he:farms:advanced">עברית (he)</a></li><li class="a"><a class="wikilink2" title="Magyar" href="/hu:farms:advanced">Magyar (hu)</a></li><li class="a"><a class="wikilink2" title="Italiano" href="/it:farms:advanced">Italiano (it)</a></li><li class="a"><a class="wikilink2" title="日本語" href="/ja:farms:advanced">日本語 (ja)</a></li><li class="a"><a class="wikilink2" title="한국어" href="/ko:farms:advanced">한국어 (ko)</a></li><li class="a"><a class="wikilink2" title="Lietuvių Kalba" href="/lt:farms:advanced">Lietuvių Kalba (lt)</a></li><li class="a"><a class="wikilink2" title="Nederlands" href="/nl:farms:advanced">Nederlands (nl)</a></li><li class="a"><a class="wikilink2" title="Norsk" href="/no:farms:advanced">Norsk (no)</a></li><li class="a"><a class="wikilink2" title="Polski" href="/pl:farms:advanced">Polski (pl)</a></li><li class="a"><a class="wikilink2" title="Português" href="/pt-br:farms:advanced">Português (pt-br)</a></li><li class="a"><a class="wikilink2" title="Română" href="/ro:farms:advanced">Română (ro)</a></li><li class="a"><a class="wikilink2" title="Русский" href="/ru:farms:advanced">Русский (ru)</a></li><li class="a"><a class="wikilink2" title="Српски Језик" href="/sr:farms:advanced">Српски Језик (sr)</a></li><li class="a"><a class="wikilink2" title="Svenska" href="/sv:farms:advanced">Svenska (sv)</a></li><li class="a"><a class="wikilink2" title="ไทย" href="/th:farms:advanced">ไทย (th)</a></li><li class="a"><a class="wikilink2" title="Українська" href="/uk:farms:advanced">Українська (uk)</a></li><li class="a"><a class="wikilink2" title="中文" href="/zh:farms:advanced">中文 (zh)</a></li><li class="a"><a class="wikilink2" title="繁體中文" href="/zh-tw:farms:advanced">繁體中文 (zh-tw)</a></li></ul></div> <p> <strong>Learn about DokuWiki</strong> </p> <ul> <li class="level1"><div class="li"> <a href="/features" class="wikilink1" title="features" data-wiki-id="features">Features</a> &amp; <a href="/blogroll" class="wikilink1" title="blogroll" data-wiki-id="blogroll">reviews</a> </div> </li> <li class="level1"><div class="li"> <a href="/install" class="wikilink1" title="install" data-wiki-id="install">Installation guide</a></div> </li> <li class="level1"><div class="li"> <a href="/manual" class="wikilink1" title="manual" data-wiki-id="manual">User manual</a> &amp; <a href="/wiki:syntax" class="wikilink1" title="wiki:syntax" data-wiki-id="wiki:syntax">syntax</a></div> </li> <li class="level1"><div class="li"> <a href="/changes" class="wikilink1" title="changes" data-wiki-id="changes">Release notes</a></div> </li> <li class="level1"><div class="li"> <a href="/faq" class="wikilink1" title="faq" data-wiki-id="faq">FAQ</a></div> </li> </ul> <p> <strong>Advanced Use</strong> </p> <ul> <li class="level1"><div class="li"> <a href="/extensions" class="wikilink1" title="extensions" data-wiki-id="extensions">Extensions</a></div> </li> <li class="level1"><div class="li"> <a href="/development" class="wikilink1" title="development" data-wiki-id="development">Development manual</a></div> </li> </ul> <p> <strong>Corporate Use</strong> </p> <ul> <li class="level1"><div class="li"> <a href="/faq:support" class="wikilink1" title="faq:support" data-wiki-id="faq:support">Get support</a></div> </li> <li class="level1"><div class="li"> <a href="/donate" class="wikilink1" title="donate" data-wiki-id="donate">Donations</a></div> </li> </ul> <p> <strong>Our Community</strong> </p> <ul> <li class="level1"><div class="li"> <a href="/teams:getting_involved" class="wikilink1" title="teams:getting_involved" data-wiki-id="teams:getting_involved">Get involved</a></div> </li> <li class="level1"><div class="li"> <a href="/dokuinstall" class="wikilink1" title="dokuinstall" data-wiki-id="dokuinstall">Users</a></div> </li> <li class="level1"><div class="li"> <a href="http://forum.dokuwiki.org" class="urlextern" title="http://forum.dokuwiki.org">User forum</a></div> </li> <li class="level1"><div class="li"> <a href="/mailinglist" class="wikilink1" title="mailinglist" data-wiki-id="mailinglist">Development mailinglist</a></div> </li> </ul> <hr /> <p> Follow us on <a href="https://phpc.social/@dokuwiki" class="urlextern" title="https://phpc.social/@dokuwiki">Mastodon</a> and other <a href="/social" class="wikilink1" title="social" data-wiki-id="social">social networks</a>. </p> <p> <a href="/privacy" class="wikilink1" title="privacy" data-wiki-id="privacy">Our Privacy Policy</a> </p> </div></div> </div></nav><!-- /aside --> <!-- ********** CONTENT ********** --> <main id="dokuwiki__content"><div class="pad group"> <div class="pageId"><span>farms:advanced</span></div> <div class="page group"> <!-- wikipage start --> <!-- TOC START --> <div id="dw__toc" class="dw__toc"> <h3 class="toggle">Table of Contents</h3> <div> <ul class="toc"> <li class="level1"><div class="li"><a href="#advanced_farm_setups_and_tips">Advanced Farm Setups and Tips</a></div> <ul class="toc"> <li class="level2"><div class="li"><a href="#cli_tools">CLI tools</a></div></li> <li class="level2"><div class="li"><a href="#setting_defaults_and_restricting_options">Setting defaults and restricting options</a></div></li> <li class="level2"><div class="li"><a href="#disabling_access_to_the_farmer">Disabling access to the farmer</a></div></li> <li class="level2"><div class="li"><a href="#central_user_management">Central user management</a></div></li> <li class="level2"><div class="li"><a href="#flexible_htaccess-based_setups">Flexible .htaccess-based setups</a></div> <ul class="toc"> <li class="level3"><div class="li"><a href="#more_than_one_domain">More than one domain</a></div></li> <li class="level3"><div class="li"><a href="#custom_paths">Custom paths</a></div></li> </ul> </li> <li class="level2"><div class="li"><a href="#running_a_farm_behind_a_reverse_proxy">Running a farm behind a reverse proxy</a></div></li> </ul></li> </ul> </div> </div> <!-- TOC END --> <h1 class="sectionedit1" id="advanced_farm_setups_and_tips">Advanced Farm Setups and Tips</h1> <div class="level1"> <p> <img src="/lib/images/smileys/fixme.svg" class="icon smiley" alt="FIXME" /> Most of the <a href="/tips:farm" class="wikilink1" title="tips:farm" data-wiki-id="tips:farm">old farm documentation</a> which isn&#039;t covered in the <a href="/farms" class="wikilink1" title="farms" data-wiki-id="farms">new farm documentation</a> should be added here. </p> <p> The following sections assume a setup similar to the one described on <a href="/farms" class="wikilink1" title="farms" data-wiki-id="farms">farms</a>. </p> </div> <div class="secedit editbutton_section editbutton_1"><form class="button btn_secedit" method="post" action="/farms:advanced"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1720174534" /><input type="hidden" name="summary" value="[Advanced Farm Setups and Tips] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="advanced_farm_setups_and_tips" /><input type="hidden" name="codeblockOffset" value="0" /><input type="hidden" name="range" value="1-267" /><button type="submit" title="Advanced Farm Setups and Tips">Edit</button></div></form></div> <h2 class="sectionedit2" id="cli_tools">CLI tools</h2> <div class="level2"> <p> If you want to use the <a href="/cli" class="wikilink1" title="cli" data-wiki-id="cli">command line tools</a> you only need to set the animal name in the <code>animal</code> environment variable. For example if you want to execute <code>bin/indexer.php</code> for the “foo” animal, you can use <code>animal=foo bin/indexer.php</code>. </p> </div> <div class="secedit editbutton_section editbutton_2"><form class="button btn_secedit" method="post" action="/farms:advanced"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1720174534" /><input type="hidden" name="summary" value="[CLI tools] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="cli_tools" /><input type="hidden" name="codeblockOffset" value="0" /><input type="hidden" name="range" value="268-540" /><button type="submit" title="CLI tools">Edit</button></div></form></div> <h2 class="sectionedit3" id="setting_defaults_and_restricting_options">Setting defaults and restricting options</h2> <div class="level2"> <p> You can add additional configuration files for the default values that should be used in animals and for restricting certain configuration options. If you add the following code to the end of <code>inc/preload.php</code>, the main configuration file of the farmer will be used as default for all animals and the protected file of the farmer will be used as the last protected file for all animals which means that animals then can&#039;t change these options. This could be used in order to disable certain options like <a href="/config:phpok" class="wikilink1" title="config:phpok" data-wiki-id="config:phpok">phpok</a> if you don&#039;t trust the animal admin. </p> <pre class="code file php"><span class="re0">$config_cascade</span><span class="br0">&#91;</span><span class="st_h">'main'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'default'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> DOKU_INC<span class="sy0">.</span><span class="st_h">'conf/local.php'</span><span class="sy0">;</span> <span class="re0">$config_cascade</span><span class="br0">&#91;</span><span class="st_h">'main'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'protected'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> DOKU_INC<span class="sy0">.</span><span class="st_h">'conf/local.protected.php'</span><span class="sy0">;</span></pre> <p> Note that these changes also affect the farmer if it can be accessed. This will break the configuration manager in the farmer as it assumes that all changed values are defaults and will remove them from the configuration. </p> <p> You can use similar changes for the plugins cascade in order to define a set of plugins that are enabled by default or a set of plugins that must or must not be enabled. </p> <p> You can of course also completely change the configuration cascade, you can find the default configuration cascade that is used in farms at the end of <code>inc/farm.php</code>. </p> </div> <div class="secedit editbutton_section editbutton_3"><form class="button btn_secedit" method="post" action="/farms:advanced"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1720174534" /><input type="hidden" name="summary" value="[Setting defaults and restricting options] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="setting_defaults_and_restricting_options" /><input type="hidden" name="codeblockOffset" value="0" /><input type="hidden" name="range" value="541-1883" /><button type="submit" title="Setting defaults and restricting options">Edit</button></div></form></div> <h2 class="sectionedit4" id="disabling_access_to_the_farmer">Disabling access to the farmer</h2> <div class="level2"> <p> If you want to disable access to the farmer you can add something like </p> <pre class="code php"><span class="kw1">if</span> <span class="br0">&#40;</span>DOKU_FARM <span class="sy0">==</span> <span class="kw4">false</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> nice_die<span class="br0">&#40;</span><span class="st_h">'Access to the farmer denied'</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="br0">&#125;</span></pre> <p> at the end of <code>inc/preload.php</code> (after the inclusion of <code>farm.php</code>). </p> </div> <div class="secedit editbutton_section editbutton_4"><form class="button btn_secedit" method="post" action="/farms:advanced"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1720174534" /><input type="hidden" name="summary" value="[Disabling access to the farmer] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="disabling_access_to_the_farmer" /><input type="hidden" name="codeblockOffset" value="1" /><input type="hidden" name="range" value="1884-2162" /><button type="submit" title="Disabling access to the farmer">Edit</button></div></form></div> <h2 class="sectionedit5" id="central_user_management">Central user management</h2> <div class="level2"> <p> If some or all of your animals shall share the users you can do that not just by using the same external authentication but also with the default user management of DokuWiki by setting the path to the user list to the same location at the end of <code>inc/preload.php</code>: </p> <pre class="code php"><span class="re0">$config_cascade</span><span class="br0">&#91;</span><span class="st_h">'plainauth.users'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span> <span class="st_h">'default'</span> <span class="sy0">=&gt;</span> <span class="st_h">'/your/path/to/conf/users.auth.php'</span><span class="sy0">,</span> <span class="br0">&#41;</span><span class="sy0">;</span></pre> <p> If you want to do that just for some animals you can of course simply add a condition based on the value of <code>DOKU_CONF</code>. </p> </div> <div class="secedit editbutton_section editbutton_5"><form class="button btn_secedit" method="post" action="/farms:advanced"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1720174534" /><input type="hidden" name="summary" value="[Central user management] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="central_user_management" /><input type="hidden" name="codeblockOffset" value="2" /><input type="hidden" name="range" value="2163-2714" /><button type="submit" title="Central user management">Edit</button></div></form></div> <h2 class="sectionedit6" id="flexible_htaccess-based_setups">Flexible .htaccess-based setups</h2> <div class="level2"> <p> Actually .htaccess-based setups can be a lot more flexible than the setups that is described on <a href="/farms" class="wikilink1" title="farms" data-wiki-id="farms">farms</a>. For these advanced setups your farm directory can and even should be outside the document root (the directory that is accessible from the web). If your farm directory is inside the document root you need to make sure that you properly protect each data directory (for example using .htaccess as it is done in a normal DokuWiki setup) as in these advanced setups they might not be automatically protected (depends on the rewrite conditions you use). </p> <p> In order to make the animals accessible as in the standard setup you can create a second farm directory inside the document root with a .htaccess file and no animal directories. You can also add <code>RewriteCond</code> statements as in the example below in order to prevent redirect loops. Then your animals can be in the domain&#039;s root directory, i.e. you can have <code>example.com/animal1/</code> for animal “animal1” and <code>example.com/dokuwiki/</code> for the farmer. </p> <dl class="code"> <dt><a href="/_export/code/farms:advanced?codeblock=3" title="Download Snippet" class="mediafile mf_htaccess">.htaccess</a></dt> <dd><pre class="code apache"><span class="kw1">RewriteEngine</span> <span class="kw2">On</span> &nbsp; <span class="co1"># Prevent rewrite loops by making sure that the farmer directory won't be matched</span> <span class="co1"># If you need to enable access to other directories either add them here or try something like</span> <span class="co1"># RewriteCond %{REQUEST_FILENAME} !-f</span> <span class="co1"># RewriteCond %{REQUEST_FILENAME} !-d</span> <span class="co1"># but then also the files of your animals (if they should be in this directory) will be accessible</span> <span class="co1"># so make sure you have properly protected them</span> &nbsp; <span class="kw1">RewriteCond</span> %{REQUEST_URI} !^/?dokuwiki/ <span class="kw1">RewriteRule</span> ^/?([^/]+)/(.*) /dokuwiki/$2?animal=$1 [QSA] <span class="kw1">RewriteCond</span> %{REQUEST_URI} !^/?dokuwiki$ <span class="co1"># RewriteCond %{REQUEST_FILENAME} !-f # allow files in the root directory (like some index file)</span> <span class="kw1">RewriteRule</span> ^/?([^/]+)$ /dokuwiki/?animal=$1 [QSA] <span class="kw1">Options</span> +<span class="kw2">FollowSymLinks</span></pre> </dd></dl> </div> <div class="secedit editbutton_section editbutton_6"><form class="button btn_secedit" method="post" action="/farms:advanced"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1720174534" /><input type="hidden" name="summary" value="[Flexible .htaccess-based setups] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="flexible_htaccess-based_setups" /><input type="hidden" name="codeblockOffset" value="3" /><input type="hidden" name="range" value="2715-4650" /><button type="submit" title="Flexible .htaccess-based setups">Edit</button></div></form></div> <h3 class="sectionedit7" id="more_than_one_domain">More than one domain</h3> <div class="level3"> <p> If you can use <a href="https://en.wikipedia.org/wiki/symbolic link" class="interwiki iw_wp" title="https://en.wikipedia.org/wiki/symbolic link">symbolic links</a> you can easily link a directory in each domain&#039;s document root to the farmer and specify this directory in the rewrite rules. </p> </div> <div class="secedit editbutton_section editbutton_7"><form class="button btn_secedit" method="post" action="/farms:advanced"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1720174534" /><input type="hidden" name="summary" value="[More than one domain] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="more_than_one_domain" /><input type="hidden" name="codeblockOffset" value="4" /><input type="hidden" name="range" value="4651-4860" /><button type="submit" title="More than one domain">Edit</button></div></form></div> <h3 class="sectionedit8" id="custom_paths">Custom paths</h3> <div class="level3"> <p> If you don&#039;t want to have all animals in one directory you can simply create a .htaccess file for each animal. In this .htaccess file you can specify the animal name. </p> <dl class="code"> <dt><a href="/_export/code/farms:advanced?codeblock=4" title="Download Snippet" class="mediafile mf_htaccess">.htaccess</a></dt> <dd><pre class="code apache"><span class="kw1">RewriteEngine</span> <span class="kw2">On</span> &nbsp; <span class="co1"># Prevent rewrite loops by making sure that the farmer directory won't be matched</span> <span class="co1"># If you need to enable access to other directories either add them here or try something like</span> <span class="co1"># RewriteCond %{REQUEST_FILENAME} !-f</span> <span class="co1"># RewriteCond %{REQUEST_FILENAME} !-d</span> <span class="co1"># but then also the files of your animal (if they should be in this directory) will be accessible</span> <span class="co1"># so make sure you have properly protected them</span> <span class="kw1">RewriteCond</span> %{REQUEST_URI} !^/?dokuwiki/ <span class="kw1">RewriteRule</span> ^/?(.*) /dokuwiki/$1?animal=ANIMAL [QSA] <span class="kw1">RewriteRule</span> ^/?$ /dokuwiki/?animal=ANIMAL [QSA] &nbsp; <span class="kw1">Options</span> +<span class="kw2">FollowSymLinks</span></pre> </dd></dl> <p> The <code>RewriteCond</code> statements prevent redirect loops when your farmer directory is inside the animal directory. That way you can also put an animal in the root directory of a domain. </p> </div> <div class="secedit editbutton_section editbutton_8"><form class="button btn_secedit" method="post" action="/farms:advanced"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1720174534" /><input type="hidden" name="summary" value="[Custom paths] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="custom_paths" /><input type="hidden" name="codeblockOffset" value="4" /><input type="hidden" name="range" value="4861-5866" /><button type="submit" title="Custom paths">Edit</button></div></form></div> <h2 class="sectionedit9" id="running_a_farm_behind_a_reverse_proxy">Running a farm behind a reverse proxy</h2> <div class="level2"> <p> This is when you set up your farm on a backend server (e.g. <a href="http://11.22.33.44" class="urlextern" title="http://11.22.33.44">http://11.22.33.44</a>) and present your wikis to the world via a front-end Apache server (e.g. <a href="http://www.example.com" class="urlextern" title="http://www.example.com">http://www.example.com</a>). </p> <p> Firstly set up the farm on the backend as per the <a href="/farms" class="wikilink1" title="farms" data-wiki-id="farms">standard docs</a>. </p> <p> In my case I&#039;ve decided to put all my DokuWiki files into one location to keep them separate from any other sites running on the backend server: </p> <p> <code>/var/www/wikis/</code> – The root of my DokuWiki installation. </p> <p> Therefore my farm setup is: </p> <ul> <li class="level1"><div class="li"> <code>/var/www/wikis/dokuwiki</code> – the DokuWiki engine, this needs to be accessible from the web</div> </li> <li class="level1"><div class="li"> <code>/var/www/wikis/farm</code> – the DokuWiki farm directory which contains all the animals</div> </li> <li class="level1"><div class="li"> <code>/var/www/wikis/farm/bear</code> – my first wiki which is about bears</div> </li> </ul> <p> On the backend server my wiki about bears (once fully setup) will be available at the following address: <a href="http://11.22.33.44/wikis/farm/bear" class="urlextern" title="http://11.22.33.44/wikis/farm/bear">http://11.22.33.44/wikis/farm/bear</a> </p> <p> However, on the frontend server I want to present my wiki with the following address (notice I&#039;ve chosen to drop the &#039;s&#039; from &#039;wikis&#039; in this <abbr title="Uniform Resource Locator">URL</abbr>): <a href="http://www.example.com/wiki/bear" class="urlextern" title="http://www.example.com/wiki/bear">http://www.example.com/wiki/bear</a> </p> <p> Using the .htaccess type of setup, I set up <code>/var/www/wikis/farm/.htaccess</code> with the following code: </p> <dl class="code"> <dt><a href="/_export/code/farms:advanced?codeblock=5" title="Download Snippet" class="mediafile mf_htaccess">.htaccess</a></dt> <dd><pre class="code apache"><span class="kw1">RewriteEngine</span> <span class="kw2">On</span> &nbsp; <span class="kw1">RewriteRule</span> ^/?([^/]+)/(.*) /wikis/dokuwiki/$2?animal=$1 [QSA] <span class="kw1">RewriteRule</span> ^/?([^/]+)$ /wikis/dokuwiki/?animal=$1 [QSA] <span class="kw1">Options</span> +<span class="kw2">FollowSymLinks</span></pre> </dd></dl> <p> Under <code>/var/www/wikis/farm/bear/conf</code> I then edit <strong>local.protected.php</strong> like so (note: this uses the front-end address): </p> <dl class="code"> <dt><a href="/_export/code/farms:advanced?codeblock=6" title="Download Snippet" class="mediafile mf_php">local.protected.php</a></dt> <dd><pre class="code php"><span class="kw2">&lt;?php</span> <span class="co4">/** * These settings are &quot;protected&quot; and cannot be overwritten * by the configuration manager, but need to be edited manually. */</span> &nbsp; <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'savedir'</span><span class="br0">&#93;</span> <span class="sy0">=</span> DOKU_CONF<span class="sy0">.</span><span class="st_h">'../data'</span><span class="sy0">;</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'updatecheck'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> <span class="co1">// if you're using the .htaccess base setup, set this to your animal's base directory:</span> <span class="re0">$conf</span><span class="br0">&#91;</span><span class="st_h">'basedir'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st_h">'/wiki/bear/'</span><span class="sy0">;</span></pre> </dd></dl> <p> Therefore I use <a href="http://httpd.apache.org/docs/2.2/mod/mod_proxy.html" class="urlextern" title="http://httpd.apache.org/docs/2.2/mod/mod_proxy.html">Apache&#039;s mod_proxy</a> and set up the config in <strong>httpd.conf</strong> on the front-end server: </p> <dl class="code"> <dt><a href="/_export/code/farms:advanced?codeblock=7" title="Download Snippet" class="mediafile mf_conf">httpd.conf</a></dt> <dd><pre class="code apache"> &lt;<span class="kw3">Location</span> /wiki&gt; <span class="kw1">ProxyPass</span> http://11.22.33.44/wikis/farm <span class="kw1">ProxyPassReverse</span> http://11.22.33.44/wikis/farm &lt;/<span class="kw3">Location</span>&gt;</pre> </dd></dl> <p> This means that any animals in my farm will always be reverse proxied from the desired front-end address. </p> <p> This works very well until you perform certain actions (e.g. login, logout, saving edits etc.) Due to the fact that the DokuWiki engine does a redirect at these points, the end-user&#039;s browser is sent a HTTP 302 header containing the following: </p> <p> <code>Location: <a href="http://11.22.33.44/wiki/bear/doku.php?id=blahblahblah" class="urlextern" title="http://11.22.33.44/wiki/bear/doku.php?id=blahblahblah">http://11.22.33.44/wiki/bear/doku.php?id=blahblahblah</a></code> </p> <p> Of course there is no page at this location on the backend server and the result is a HTTP 404 Page Not Found error message in the user&#039;s browser. </p> <p> The remedy is to use <a href="http://httpd.apache.org/docs/2.2/mod/mod_headers.html" class="urlextern" title="http://httpd.apache.org/docs/2.2/mod/mod_headers.html">Apache&#039;s mod_headers</a>. We amend our code block in <strong>httpd.conf</strong> like so: </p> <dl class="code"> <dt><a href="/_export/code/farms:advanced?codeblock=8" title="Download Snippet" class="mediafile mf_conf">httpd.conf</a></dt> <dd><pre class="code apache"> &lt;<span class="kw3">Location</span> /wiki&gt; <span class="kw1">ProxyPass</span> http://11.22.33.44/wikis/farm <span class="kw1">ProxyPassReverse</span> http://11.22.33.44/wikis/farm <span class="kw1">Header</span> edit Location ^http://11.22.33.44 http://www.example.com &lt;/<span class="kw3">Location</span>&gt;</pre> </dd></dl> <p> The &#039;Location&#039; response header is now re-written to the correct address and everything works fine. </p> </div> <div class="secedit editbutton_section editbutton_9"><form class="button btn_secedit" method="post" action="/farms:advanced"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1720174534" /><input type="hidden" name="summary" value="[Running a farm behind a reverse proxy] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="running_a_farm_behind_a_reverse_proxy" /><input type="hidden" name="codeblockOffset" value="5" /><input type="hidden" name="range" value="5867-" /><button type="submit" title="Running a farm behind a reverse proxy">Edit</button></div></form></div> <!-- wikipage stop --> </div> <div class="docInfo"><bdi>farms/advanced.txt</bdi> · Last modified: <time datetime="2024-07-05T12:15:34+0200">2024-07-05 12:15</time> by <bdi>147.161.139.27</bdi></div> <hr class="a11y" /> </div></main><!-- /content --> <!-- PAGE ACTIONS --> <nav id="dokuwiki__pagetools" aria-labelledby="dokuwiki__pagetools__heading"> <h3 class="a11y" id="dokuwiki__pagetools__heading">Page Tools</h3> <div class="tools"> <ul> <li class="edit"><a href="/farms:advanced?do=edit" title="Edit this page [e]" rel="nofollow" accesskey="e"><span>Edit this page</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25z"/></svg></a></li><li class="revs"><a href="/farms:advanced?do=revisions" title="Old revisions [o]" rel="nofollow" accesskey="o"><span>Old revisions</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M11 7v5.11l4.71 2.79.79-1.28-4-2.37V7m0-5C8.97 2 5.91 3.92 4.27 6.77L2 4.5V11h6.5L5.75 8.25C6.96 5.73 9.5 4 12.5 4a7.5 7.5 0 0 1 7.5 7.5 7.5 7.5 0 0 1-7.5 7.5c-3.27 0-6.03-2.09-7.06-5h-2.1c1.1 4.03 4.77 7 9.16 7 5.24 0 9.5-4.25 9.5-9.5A9.5 9.5 0 0 0 12.5 2z"/></svg></a></li><li class="backlink"><a href="/farms:advanced?do=backlink" title="Backlinks" rel="nofollow"><span>Backlinks</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M10.59 13.41c.41.39.41 1.03 0 1.42-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0 5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.982 2.982 0 0 0 0-4.24 2.982 2.982 0 0 0-4.24 0l-3.53 3.53a2.982 2.982 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0 5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.982 2.982 0 0 0 0 4.24 2.982 2.982 0 0 0 4.24 0l3.53-3.53a2.982 2.982 0 0 0 0-4.24.973.973 0 0 1 0-1.42z"/></svg></a></li><li class="top"><a href="#dokuwiki__top" title="Back to top [t]" rel="nofollow" accesskey="t"><span>Back to top</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"/></svg></a></li> </ul> </div> </nav> </div><!-- /wrapper --> <!-- ********** FOOTER ********** --> <footer id="dokuwiki__footer"><div class="pad"> <div class="license">Except where otherwise noted, content on this wiki is licensed under the following license: <bdi><a href="https://creativecommons.org/licenses/by-sa/4.0/deed.en" rel="license" class="urlextern">CC Attribution-Share Alike 4.0 International</a></bdi></div> <div class="buttons"> <a href="https://creativecommons.org/licenses/by-sa/4.0/deed.en" rel="license"><img src="/lib/images/license/button/cc-by-sa.png" alt="CC Attribution-Share Alike 4.0 International" /></a> <a href="https://www.dokuwiki.org/donate" title="Donate" ><img src="/lib/tpl/dokuwiki/images/button-donate.gif" width="80" height="15" alt="Donate" /></a> <a href="https://php.net" title="Powered by PHP" ><img src="/lib/tpl/dokuwiki/images/button-php.gif" width="80" height="15" alt="Powered by PHP" /></a> <a href="//validator.w3.org/check/referer" title="Valid HTML5" ><img src="/lib/tpl/dokuwiki/images/button-html5.png" width="80" height="15" alt="Valid HTML5" /></a> <a href="//jigsaw.w3.org/css-validator/check/referer?profile=css3" title="Valid CSS" ><img src="/lib/tpl/dokuwiki/images/button-css.png" width="80" height="15" alt="Valid CSS" /></a> <a href="https://dokuwiki.org/" title="Driven by DokuWiki" ><img src="/lib/tpl/dokuwiki/images/button-dw.png" width="80" height="15" alt="Driven by DokuWiki" /></a> </div> <div style="margin-top: 2em; font-size:90%" class="dokuwiki"><div style="float:right"><a href="http://www.splitbrain.org/personal#imprint" style="float:right; text-decoration: none; color:#333">Imprint</a></div></div><!-- Include for DokuWiki site wide top bar --> <style type="text/css"> @media screen { body { padding-top: 30px; } #global__header { position: absolute; top: 0; left: 0; text-align: left; vertical-align: middle; line-height: 1.5; background-color: #333; box-shadow: 0 0 8px rgba(0,0,0,0.5); width: 100%; margin: 0; padding: 5px 20px; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; white-space: nowrap; overflow: hidden; } #global__header h2 { position: absolute; left: -99999em; top: 0; overflow: hidden; display: inline; } #global__header ul, #global__header li { margin: 0; padding: 0; list-style: none; display: inline; line-height: 1.5; } #global__header a { color: #bbb; text-decoration: none; margin-right: 20px; font-size: 14px; font-weight: normal; } #global__header a:hover, #global__header a:active, #global__header a:focus { color: #fff; text-decoration: underline; } #global__header form { float: right; margin: 0 0 0 20px; } #global__header input { background-color: #333; background-image: none; border: 1px solid #bbb; color: #fff; box-shadow: none; border-radius: 2px; margin: 0; line-height: normal; padding: 1px 0 1px 0; height: auto; } #global__header input.button { border: none; color: #bbb; } #global__header input.button:hover, #global__header input.button:active, #global__header input.button:focus { color: #fff; text-decoration: underline; } } /* /@media */ @media only screen and (min-width: 601px) { /* changes specific for www.dokuwiki.org */ #dokuwiki__header { padding-top: 3em; } #dokuwiki__usertools { top: 3em; } /* changes specific for bugs.dokuwiki.org */ div#container div#showtask { top: 40px; } } /* /@media */ @media only screen and (max-width: 600px) { body { padding-top: 0; } #global__header { position: static; white-space: normal; overflow: auto; } #global__header form { float: none; display: block; margin: 0 0 .4em; } } /* /@media */ @media print { #global__header { display: none; } } /* /@media */ </style> <div id="global__header"> <h2>Global DokuWiki Links</h2> <form method="get" action="https://search.dokuwiki.org/" target="_top"> <input type="text" name="q" title="Search all DokuWiki sites at once" class="input" /> <input type="submit" title="Search all DokuWiki sites at once" value="Search" class="button" /> </form> <ul> <li><a href="https://download.dokuwiki.org" title="Download the latest release" target="_top">Download</a></li> <li><a href="https://www.dokuwiki.org" title="Read the DokuWiki documentation" target="_top">Wiki</a></li> <li><a href="https://forum.dokuwiki.org" title="Ask questions in the DokuWiki forum" target="_top">Forum</a></li> <li><a href="https://irc.dokuwiki.org" title="Check IRC chat logs or join the chat" target="_top">IRC</a></li> <li><a href="https://github.com/splitbrain/dokuwiki/issues" title="Report and track bugs" target="_top">Bugs</a></li> <li><a href="https://translate.dokuwiki.org/" title="Help translating the DokuWiki interface" target="_top">Translate</a></li> <li><a href="https://github.com/splitbrain/dokuwiki" title="Access the most recent git commits" target="_top">Git</a></li> <li><a href="https://xref.dokuwiki.org/reference/dokuwiki/" title="Cross-Reference of the DokuWiki source code" target="_top">XRef</a></li> <li><a href="https://codesearch.dokuwiki.org/" title="Search through the sources of DokuWiki, plugins and templates" target="_top">Code Search</a></li> </ul> </div> <!-- end of DokuWiki top bar include --> </div></footer><!-- /footer --> </div></div><!-- /site --> <div class="no"><img src="/lib/exe/taskrunner.php?id=farms%3Aadvanced&amp;1742571395" width="2" height="1" alt="" /></div> <div id="screen__mode" class="no"></div></body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10