Synchronet v3.17b-Win32 (install) has been released (Jan-2019).

New Synchronet YouTube channel

You can donate to the Synchronet project using PayPal.

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
server:web [2010/02/21 21:10]
digitalman
server:web [2020/03/10 11:33] (current)
Deuce Apparently http:// assplodes everything... fix.
Line 1: Line 1:
 ====== Web Server ====== ====== Web Server ======
 +
 +The Synchronet Web Server serves static (e.g. files) and dynamic content to HTTP clients (e.g. web browsers).
  
 ===== Introduction ===== ===== Introduction =====
Line 15: Line 17:
 ==== Startup INI [Web] Section Keys ==== ==== Startup INI [Web] Section Keys ====
  
-The ''​[Web]''​ section of your [[Startup INI]] file contains the following settings (keys):+The ''​[Web]''​ section of your [[config:​sbbs.ini]] file contains the following settings (keys):
  
 === RootDirectory === === RootDirectory ===
Line 24: Line 26:
 ''​http://​yourbbs.synchro.net/​index.html''​ will be served out of this directory. ''​http://​yourbbs.synchro.net/​index.html''​ will be served out of this directory.
  
-::!:: Older versions of Synchronet had this value default to ''​../​web/​html''​.+**NOTE**: Older versions of Synchronet had this value default to ''​../​web/​html''​
  
 === ErrorDirectory === === ErrorDirectory ===
 Default value: ''​error''​ Default value: ''​error''​
  
-The directory relative to [#​RootDirectory]] where the various error+The directory relative to [[#​RootDirectory]] where the various error
 message files are located. ​ The error message files are named by the message files are located. ​ The error message files are named by the
 numeric HTTP error code they will represent and may be either ''​.html''​ numeric HTTP error code they will represent and may be either ''​.html''​
Line 47: Line 49:
 === Authorization === === Authorization ===
  
-Default value: ''​Basic,​Default''​+Default value: ''​Basic,​Digest''​
  
 A comma-separated list of authentication mechanisms in order of preference. A comma-separated list of authentication mechanisms in order of preference.
Line 111: Line 113:
 Default value: ''​NO_HOST_LOOKUP''​ Default value: ''​NO_HOST_LOOKUP''​
  
-The | separated list of options to enable. ​ In addition to the standard +The ''​Options''​ key is set to a ''​|'' ​separated list of options to enable. ​ In addition to the [[config:​sbbs.ini|standard options]], the web server also supports the following:
-options, the web server also supports the following:+
  
 ''​DEBUG_RX''​ ''​DEBUG_RX''​
 +
 Log all received data to the console log, as well as various Log all received data to the console log, as well as various
 extra bits related to receiving data. extra bits related to receiving data.
  
 ''​DEBUG_TX''​ ''​DEBUG_TX''​
 +
 Log all transmitted data except the reply body itself, as well Log all transmitted data except the reply body itself, as well
 as various extra bits of information related to transmitted as various extra bits of information related to transmitted
Line 124: Line 127:
  
 ''​VIRTUAL_HOSTS''​ ''​VIRTUAL_HOSTS''​
 +
 Supports name-based virtual hosts. ​ If your system has multiple Supports name-based virtual hosts. ​ If your system has multiple
 host names, you can have each host name return unique content host names, you can have each host name return unique content
 depending on which hostname is used.  ie: if depending on which hostname is used.  ie: if
-freebsd.synchro.net and nix.synchro.net both resolved to your+''​freebsd.synchro.net'' ​and ''​nix.synchro.net'' ​both resolved to your
 system, you could have FreeBSD-specific pages on one, and  system, you could have FreeBSD-specific pages on one, and 
 general *nix stuff on the other. general *nix stuff on the other.
  
 A virtual host is added by simply putting the desired content A virtual host is added by simply putting the desired content
-into a sub-directory of RootDirectory with the desired hostname +into a sub-directory of [[#RootDirectory]] with the desired hostname 
-ie: web/​root/​freebsd.synchro.net/​ if the browser doesn'​t send+ie: ''​web/​root/​freebsd.synchro.net/​'' ​if the browser doesn'​t send
 the request host name (very old browsers, or some automated the request host name (very old browsers, or some automated
 tools) they will be served out of document root. tools) they will be served out of document root.
 It is therefore a good idea to put links to your various It is therefore a good idea to put links to your various
-virtual hosts in an index.html page in RootDirectory something+virtual hosts in an ''​index.html'' ​page in [[#RootDirectory]] something
 like this: like this:
-            ​<​html>​ +<code html> 
-              <​head>​ +<​html>​ 
-                <​title>​Old Browser</​title>​ +  ​<​head>​ 
-              </​head>​ +    <​title>​Old Browser</​title>​ 
-              <​body>​ +  </​head>​ 
-                Your browser is either too old to support +  <​body>​ 
-                name-based virtual hosts, or you have visited a +    Your browser is either too old to support 
-                virtual hosts that is not yet configured. ​ The +    name-based virtual hosts, or you have visited a 
-                following are hosted here:<​br>​ +    virtual hosts that is not yet configured. ​ The 
-                <a href="​freebsd.synchro.net">​freebsd.synchro.net +    following are hosted here:<​br>​ 
-                ​</​a><​br>​ +    <a href="​freebsd.synchro.net">​freebsd.synchro.net</​a><​br>​ 
-                <a href="​nix.synchro.net">​nix.synchro.net</​a><​br>​ +    <a href="​nix.synchro.net">​nix.synchro.net</​a><​br>​ 
-              </​body>​ +  </​body>​ 
-            </​html>​+</html
 +</code>
  
 ''​NO_CGI''​ ''​NO_CGI''​
 +
 Disable CGI script execution. Disable CGI script execution.
  
 ''​HTTP_LOGGING''​ ''​HTTP_LOGGING''​
 +
 Enable logging to a Common Logfile Format log as described in Enable logging to a Common Logfile Format log as described in
 the HttpLogFile section. ​ Usefull for running log analysis the HttpLogFile section. ​ Usefull for running log analysis
Line 163: Line 170:
  
 ''​NO_JAVASCRIPT''​ ''​NO_JAVASCRIPT''​
 +
 Disable SSJS execution. Disable SSJS execution.
  
 +''​ALLOW_TLS''​
 +
 +Enable TLS support.
 +
 +''​HSTS_SAFE''​
 +
 +Indicates that all URLs availabe via http are also available via https and redirects clients who want a TLS session to the https location.
  
 ==== Other configuration files ==== ==== Other configuration files ====
  
-In addition to the [Web] keys in the [[Startup INI]] file, the web server+In addition to the ''​[Web]'' ​keys in the [[config:​sbbs.ini]] file, the web server
 also uses some other configuration files: also uses some other configuration files:
  
Line 189: Line 204:
 specified: specified:
  
-== CGI ==+== [CGI==
  
 The [CGI] section is for natively-executed CGI handlers The [CGI] section is for natively-executed CGI handlers
-(e.g. "pl = perl" indicates "​perl"​ will be used to handle "​.pl"​ +(e.g. "pl = perl" indicates "​perl"​ will be used to handle "​.pl"​ files). ​ 
-files). ​+
  
-== JavaScript ==+== [JavaScript==
  
 The [JavaScript] section is used for JS-executed content The [JavaScript] section is used for JS-executed content
Line 209: Line 223:
 Each directory under the [[#​RootDirectory]] may have a ''​webctrl.ini''​ file which overrides certain settings for Each directory under the [[#​RootDirectory]] may have a ''​webctrl.ini''​ file which overrides certain settings for
 the directory it's in and all child directories. ​ Configuration keys may be set the directory it's in and all child directories. ​ Configuration keys may be set
-either globally, ​or in a per-filename group. ​ Using the * and ? wildcards as +either globally, in a per-filename group, or, in version 3.17 or greater, a per-directory-name group. 
-the group name such as ''​[*.html]''​. ​ The following keys may be used in these files:+Using the * and ? wildcards as the group name such as ''​[*.html]''​ or ''​[dirname/​]''​. ​ The following keys may be used in these files:
  
 === AccessRequirements === === AccessRequirements ===
 Specifices an ARS string which all users must match to be able to access Specifices an ARS string which all users must match to be able to access
 files in this directory. ​ Will force an HTTP login. files in this directory. ​ Will force an HTTP login.
 +
 +For example, to require a login, but allow **any** user to access files in a
 +directory, but only a sysop to access ''​*.log''​ files and .git directories,​ the following could be used:
 +<file webctrl.ini>​
 +AccessRequirements=level 0
 +[*.log]
 +AccessRequirements=level 90
 +[*.git]
 +AccessRequirements=level 90
 +</​file>​
  
 === Realm === === Realm ===
Line 242: Line 266:
 current directory. ​ This effecively works like a custom 404 page. current directory. ​ This effecively works like a custom 404 page.
  
-For example, to require ​login, but allow **any** user to access files in a +=== FastCGISocket === 
-directorybut only a sysop to access ''​*.log'' ​filesthe following could be used: +Specifies the socket and port of FastCGI listener ​in the <​Address>:<​Port>​ format (ie: 127.0.0.1:​9000). ​ Should be used with wildcard sections like this: 
-  AccessRequirements=level 0 +<file webctrl.ini>​ 
-  [*.log] +[*.php] 
-  AccessRequirements=level90+FastCGISocket=127.0.0.1:​9000 
 +</​file>​ 
 + 
 +Added on November 1st2015 to CVS (in 3.17a). 
 + 
 +See [[howto:​php]] for details on using with PHP. 
 + 
 +=== Rewrite=== 
 +Specifies a Javascript snippet which can modify the http_request.request_string. ​ This allows internal redirects like the RewriteRule feature in Apache .htaccess ​files.  The key must *begin* with the string "​Rewrite"​ which may be followed by any legal INI key characters. ​ The order of execution is not guaranteed. 
 + 
 +Added on November 3rd, 2015 to CVS (in 3.17a). 
 + 
 +=== JSPreExec ==
 +A JavaScript snippet which is executed in the same context as Rewritelines, but before any Rewrites are executed.  ​This allows load()ing some common code before execution... ie: ''​JSPreExec=load(js.startup_dir+'/​rewrite_lib.js'​);''​.
  
 +Added on November 3rd, 2015 to CVS (in 3.17a).
  
 ===== JavaScript Objects ===== ===== JavaScript Objects =====
Line 347: Line 385:
 ==== Extra global methods ==== ==== Extra global methods ====
  
-The web server also adds new global JavaScript ​methods. ​ These are:+The web server also adds new global JavaScript ​method that requests that the specified cookie be set:
  
   set_cookie(string key,    set_cookie(string key, 
Line 355: Line 393:
     [, string path      [, string path 
     [, bool secure ]]]])     [, bool secure ]]]])
-               ​Requests that the specified cookie be set. 
- 
  
 ===== The SSJS Template System ===== ===== The SSJS Template System =====
Line 362: Line 398:
 support. support.
  
-[Note: ​ With this latest implementation of SSJS, @@ codes no longer can be +[Note: ​ With this latest implementation of SSJS, @@ codes no longer can be nested.]
-nested.]+
  
  
Line 381: Line 416:
 === Top Navigation === === Top Navigation ===
  
-  ../​web/​templates/​default/​topnav.inc ​../​web/​lib/​topnav_html.ssjs+  ../​web/​templates/​default/​topnav.inc 
 +  ​../​web/​lib/​topnav_html.ssjs
  
-The topnav.inc file contains the basic design of the "​breadcrumbs"​ +The ''​topnav.inc'' ​file contains the basic design of the "​breadcrumbs"​ 
-The links are dynamically generated by topnav_html.ssjs so both+The links are dynamically generated by ''​topnav_html.ssjs'' ​so both
 files need to be addressed when modifying or creating themes. files need to be addressed when modifying or creating themes.
-In the case of the default layout, topnav.inc has a left and right +In the case of the default layout, ​''​topnav.inc'' ​has a left and right 
 graphic and a middle section that the dynamic content goes.  The graphic and a middle section that the dynamic content goes.  The
 background image is handled by CSS.  You can change this to anything background image is handled by CSS.  You can change this to anything
 you like. you like.
  
-The topnav_html.ssjs file may seem daunting at first, but it is +The ''​topnav_html.ssjs'' ​file may seem daunting at first, but it is 
 pretty straight forward. ​ It has a series of if statements that pretty straight forward. ​ It has a series of if statements that
 check the current page location and sets up the breadcrumbs based check the current page location and sets up the breadcrumbs based
Line 399: Line 435:
 You want to add a Links page called links.html in the main  You want to add a Links page called links.html in the main 
 directory. ​ You would add a check for the path to links.html directory. ​ You would add a check for the path to links.html
-as:   +as:
-                if(http_request.virtual_path=="/​links.html"​) +
-                    template.topnav.push({html:​ '<​span class="​tlink">​ +
-                        Some Links</​span>'​});​+
  
 +<code javascript>​
 +if(http_request.virtual_path=="/​links.html"​)
 +    template.topnav.push({html:​ '<​span class="​tlink">​Some Links</​span>'​});​
 +</​code> ​  
 +  ​
 === Left Side Navigation === === Left Side Navigation ===
  
- ../​web/​templates/​default/​leftnav.inc ​../​web/​lib/​leftnav_nodelist.ssjs ​../​web/​lib/​leftnav_html.ssjs+  ​../​web/​templates/​default/​leftnav.inc 
 +  ​../​web/​lib/​leftnav_nodelist.ssjs 
 +  ​../​web/​lib/​leftnav_html.ssjs
  
 This starts the main table layout in the default layout and also This starts the main table layout in the default layout and also
Line 434: Line 474:
  
 ==== SSJS Theme Support ==== ==== SSJS Theme Support ====
- 
  
 Theme Layouts can be added to Synchronet by creating them and placing the Theme Layouts can be added to Synchronet by creating them and placing the
Line 441: Line 480:
 Themes are activated by editing the ../​web/​templates/​html_themes.ssjs file. Themes are activated by editing the ../​web/​templates/​html_themes.ssjs file.
 This file contains: This file contains:
-<FILE+<code javascript
-    /* Set default theme name */ +/* Set default theme name */ 
-    var DefaultTheme="​Default";​+var DefaultTheme="​Default";​ 
 + 
 +/* Edit this bit to add/​remove/​modify theme descriptions and dirs */ 
 +Themes["​Default"​]=new Object; 
 +Themes["​Default"​].desc="​Default Synchronet Theme";​ 
 +Themes["​Default"​].dir="​default";​ 
 +Themes["​Default"​].css="/​synchronet.css";​  
 +</​code>​
  
-    /* Edit this bit to add/​remove/​modify theme descriptions and dirs */ 
-    Themes["​Default"​]=new Object; 
-    Themes["​Default"​].desc="​Default Synchronet Theme";​ 
-    Themes["​Default"​].dir="​default";​ 
-    Themes["​Default"​].css="/​synchronet.css"; ​ 
-</​FILE>​ 
 Themes are added by editing below the Default Theme such as: Themes are added by editing below the Default Theme such as:
-<FILE+<code javascript
-    Themes["​CoolTheme"​]=new Object; +Themes["​CoolTheme"​]=new Object; 
-    Themes["​CoolTheme"​].desc="​My Cool Theme";​ +Themes["​CoolTheme"​].desc="​My Cool Theme";​ 
-    Themes["​CoolTheme"​].dir="​cooltheme";​ +Themes["​CoolTheme"​].dir="​cooltheme";​ 
-    Themes["​CoolTheme"​].css="/​cooltheme.css";​ +Themes["​CoolTheme"​].css="/​cooltheme.css";​ 
-</FILE>+</code>
 To change the Default Theme, change: To change the Default Theme, change:
  
-    ​var DefaultTheme="​Default";​ +<code javascript>​ 
 +var DefaultTheme="​Default";​ 
 +</​code> ​
 to: to:
- +<code javascript>​ 
-    var DefaultTheme="​CoolTheme";​ +var DefaultTheme="​CoolTheme";​ 
 +</​code>​
  
 ==== Special Codes Used in the SSJS Template System ==== ==== Special Codes Used in the SSJS Template System ====
Line 477: Line 518:
  
 For example the groups.inc: For example the groups.inc:
-<CODE+<code html
-  <!-- Main Content -->  ​+<!-- Main Content -->  ​
     ​     ​
-    ​<td class="​main"​ valign="​top"><​br />+<td class="​main"​ valign="​top"><​br />
  
-  ​<table class="​grouplist"​ border="​0"​ cellpadding="​2"​ cellspacing="​2">​ +<table class="​grouplist"​ border="​0"​ cellpadding="​2"​ cellspacing="​2">​ 
-  <​tr>​ +<​tr>​ 
-  <th class="​grouplist">​Message Group</​th><​th class="​grouplist">​Subs</​th>​ +<th class="​grouplist">​Message Group</​th><​th class="​grouplist">​Subs</​th>​ 
-  </​tr>​ +</​tr>​ 
-  <<​REPEAT groups>>​ +<<​REPEAT groups>>​ 
-  <​tr>​ +<​tr>​ 
-    <td class="​grouplist">​ +  <td class="​grouplist">​ 
-        <a class="​grouplist"​ href="​subs.ssjs?​msg_grp=^^groups:​name^^">​ +      <a class="​grouplist"​ href="​subs.ssjs?​msg_grp=^^groups:​name^^">​ 
-            %%groups:​description%%</​a></​td>​ +          %%groups:​description%%</​a></​td>​ 
-    <td class="​grouplist"​ align="​right">​ +  <td class="​grouplist"​ align="​right">​ 
-        @@JS:​msg_area.grp_list[RepeatObj.index].sub_list.length@@</​td>​ +      @@JS:​msg_area.grp_list[RepeatObj.index].sub_list.length@@</​td>​ 
-  </​tr>​ +</​tr>​ 
-  <<END REPEAT groups>>​ +<<END REPEAT groups>>​ 
-  </​table>​ +</​table>​ 
-  <br />+<br /
 + 
 +<!-- end Main Content --> 
 +</code>
  
-  <!-- end Main Content --> 
-</​CODE>​ 
 While the table layout can be changed or even eliminated, the information While the table layout can be changed or even eliminated, the information
 within the <<​REPEAT groups>>​ and <<END REPEAT groups>>​ must remain intact. within the <<​REPEAT groups>>​ and <<END REPEAT groups>>​ must remain intact.
 To remove the table yet keep the correct infomation, the resulting groups.inc To remove the table yet keep the correct infomation, the resulting groups.inc
 would be changed to (while maintaining the main table layout in this case) to: would be changed to (while maintaining the main table layout in this case) to:
-<CODE+<code html
-  <!-- Main Content -->  ​+<!-- Main Content -->  ​
     ​     ​
     <td class="​main"​ valign="​top"><​br />     <td class="​main"​ valign="​top"><​br />
Line 518: Line 560:
  
   <!-- end Main Content -->   <!-- end Main Content -->
-</CODE> +</code>
-This principle applies to all the .inc files in msgs respectively.+
  
 +This principle applies to all the .inc files in msgs respectively.
  
 ==== The SSJS Template Library ==== ==== The SSJS Template Library ====
Line 526: Line 568:
 ''​%%name%%''​ is replaced with the HTML encoded value of template.name ''​%%name%%''​ is replaced with the HTML encoded value of template.name
  
-i.e.; Spaces are replaced with: this&​nbsp;​is&​nbsp;​html+i.e.; Spaces are replaced with: ''​this&​nbsp;​is&​nbsp;​html''​
  
 ''​^^name^^''​ is replaced with the URI encoded value of template.name ''​^^name^^''​ is replaced with the URI encoded value of template.name
  
-i.e.; Spaces are replaced with:  this%20is%20URI+i.e.; Spaces are replaced with:  ​''​this%20is%20URI''​
           ​           ​
-''​@@name@@''​ is replaced with the value if template.name+''​@@name@@''​ is replaced with the value if ''​template.name''​
  
 No changes or encoding is performed. No changes or encoding is performed.
  
-''​@@name:​sname@@''​ is replaced with the value of template.name.sname+''​@@name:​sname@@''​ is replaced with the value of ''​template.name.sname''​
 (^^ and %% are also supported) (^^ and %% are also supported)
  
-''​@@JS:​js_expression@@''​ is replaced with the return value of js_expression ​  ​+''​@@JS:​js_expression@@''​ is replaced with the return value of ''​js_expression''​
 (^^ and %% are also supported) (^^ and %% are also supported)
  
-  ​<<​REPEAT name>>​ +<code javascript>​ 
-    @@name:​sname@@ +<<​REPEAT name>>​ 
-  <<END REPEAT name>>​+  @@name:​sname@@ 
 +<<END REPEAT name>
 +</code>
  
-Iterates over the array/​object template.name and replaces name:sname with  +Iterates over the array/​object ​''​template.name'' ​and replaces ​''​name:sname'' ​with  
-the value of template.name.sname.+the value of ''​template.name.sname''​.
 (^^ and %% are also supported) (^^ and %% are also supported)
  
Line 555: Line 599:
 Configuration settings for the SSJS Messaging system is located in the Configuration settings for the SSJS Messaging system is located in the
 ''​../​web/​lib/​msgsconfig.ssjs''​ file: ''​../​web/​lib/​msgsconfig.ssjs''​ file:
-<FILE>+<code javascript>
 max_messages=20;​ max_messages=20;​
 max_pages=30;​ max_pages=30;​
Line 574: Line 618:
 private_allowed_message='<​input type="​checkbox"​ name="​private"​ value="​Yes"​ /> Mark message as private';​ private_allowed_message='<​input type="​checkbox"​ name="​private"​ value="​Yes"​ /> Mark message as private';​
 private_reply_message='<​input type="​checkbox"​ name="​private"​ value="​Yes"​ checked /> Mark message as private';​ private_reply_message='<​input type="​checkbox"​ name="​private"​ value="​Yes"​ checked /> Mark message as private';​
-</FILE>+</code>
  
 Each of these are configurable. Each of these are configurable.
Line 592: Line 636:
 For example, it can check if the user is Guest or an actual user with this line: For example, it can check if the user is Guest or an actual user with this line:
  
-  ​@@JS:​if(user.number==0 || user.security.restrictions&​UFLAG_G) '<​html code for Guest>';​ else '<​html code for registered user>';​@@+<code javascript>​ 
 +@@JS:​if(user.number==0 || user.security.restrictions&​UFLAG_G) '<​html code for Guest>'; ​
 +else '<​html code for registered user>';​@@ 
 +</​code>​
         ​         ​
 What this does is display links specific for Registered Users only to them What this does is display links specific for Registered Users only to them
Line 611: Line 658:
 For example: For example:
  
-  ​template.user_alias=user.alias;​+<code javascript>​ 
 +template.user_alias=user.alias;​ 
 +</​code>​
  
 Now ''​@@user_alias@@''​ can be in any ''​*.inc''​ template files and it will display the Now ''​@@user_alias@@''​ can be in any ''​*.inc''​ template files and it will display the
Line 641: Line 690:
 either "<?​xjs"​ or "<?"​ and ends with "?>"​. ​ A simple example would be: either "<?​xjs"​ or "<?"​ and ends with "?>"​. ​ A simple example would be:
  
-<CODE>+<code html>
 <​html><​head><​title><?​xjs write(system.name) ?></​title></​head>​ <​html><​head><​title><?​xjs write(system.name) ?></​title></​head>​
 <​body>​ <​body>​
Line 648: Line 697:
 </​body>​ </​body>​
 </​html>​ </​html>​
-</CODE>+</code>
  
 This would send the following web page to the remote system: This would send the following web page to the remote system:
-<CODE>+<code html>
 <​html><​head><​title>​My Brand New BBS</​title></​head>​ <​html><​head><​title>​My Brand New BBS</​title></​head>​
 <​body>​ <​body>​
Line 658: Line 707:
 </​body>​ </​body>​
 </​html>​ </​html>​
-</CODE>+</code>
  
 Looping constructs are permitted, however, not using brackets can result in Looping constructs are permitted, however, not using brackets can result in
Line 665: Line 714:
  
 The following example displays the numbers from one to 10. The following example displays the numbers from one to 10.
-<CODE>+<code html>
 <​html><​head><​title>​Counter</​title></​head>​ <​html><​head><​title>​Counter</​title></​head>​
 <​body>​ <​body>​
Line 676: Line 725:
 </​body>​ </​body>​
 </​html>​ </​html>​
-</CODE>+</code>
  
 ==== XJS-specific global methods and properties ==== ==== XJS-specific global methods and properties ====
  
-The following ​JS commands ​are available to XJS files only.+The following ​JavaScript methods and properties ​are available to XJS files only.
  
 === xjs_load(filename) === === xjs_load(filename) ===
 Runs the specified xjs file at the current position. ​ Local variables Runs the specified xjs file at the current position. ​ Local variables
-are NOT visible to xjs_load()ed pages. ​ The filename is assumed to be+are NOT visible to ''​xjs_load()''​ed pages. ​ The filename is assumed to be
 relative to the including file (or absolute.) relative to the including file (or absolute.)
  
 === cwd === === cwd ===
 Contains the path that the current xjs script was loaded from and which Contains the path that the current xjs script was loaded from and which
-parameters to xjs_load() are assumed to be relative to.  If you change +parameters to ''​xjs_load()'' ​are assumed to be relative to.  If you change 
-the value of cwd, it will change the location where xjs_load() will+the value of ''​cwd''​, it will change the location where ''​xjs_load()'' ​will
 check for files. check for files.
  
 +{{indexmenu_n>​4}}
  

In Other Languages