# Web Servers

By its nature, Siler itself is made to be lightweight and dependent-less.\
This means you can use whatever web-service technology you want.\
Here, you'll find a few example configurations for some well-known web-services.

### Composer-serve script

Siler's default configuration bundled in the `siler/project` template gives a runnable configuration that fits well for development purposes.

You can use it, while being in the root directory of your project (the folder containing your `composer.json` file), by running

```
composer serve
```

or, if you didn't install composer globally,

```
php composer.phar serve
```

*Note: The `serve` script stored in the `composer.json` file runs `php -S 0.0.0.0:8000 -t .`*

### PHP CLI

The PHP CLI can also be enough for small production servers, like for example a raspberry pi running in your home.

To run your website using the PHP CLI, you can use this simple command (adapted to your project):

```
php -S {ip/domain}[:{port}] -t .
```

#### The `{ip/domain}` block

The `{ip/domain}` block is the interface on which you want your server to listen to.

You have multiple choices:

* `127.0.0.1` will run it on `localhost` and you'll be able to access it by going to `http://127.0.0.1` or `http://localhost`in your browser.
* `192.168.x.x` (your local IP) will listen to requests coming from your local IP.\
  You can retrieve it on \*nix systems by running `ifconfig` or `ip addr` and looking for an IP generally starting with `192.168.`.
* `0.0.0.0` will listen to requests coming from *every* network interface you have on your computer, that'd be `localhost`(the loopback), your local IP and more !

Additionally, the PHP CLI supports real domains, which means you can run your website by specifying the domain name of your computer instead of its local IP.

You can retrieve your computer's domain on \*nix systems with the simple command `hostname`.\
It'll return for example `jake-computer`.

You can then use this returned domain as the listening interface: `php -S jake-computer[:{port}] -t .`

#### The `[:{port}]` block

The `[:{port}]` block is the port you want to bind your process to.

> Important: On most \*nix systems, you can't set a port below 1025 without running it as root.\
> The usual ports used are `8080` and `8000`.

*Note: The `:{port}` block is optional, but recommended.*

### Apache

#### Subfolder

If you want to make this website available under a sub-folder of your Apache server, you'll need to make sure the `AllowOverride` contains `Options=Multiviews`, like:

```
<Directory /var/www/html>
    Options +FollowSymLinks +Multiviews
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>
```

Then, in your project's root folder, you can create a simple `.htaccess` file containing:

```
# HTTPD mod_rewrite required
RewriteEngine on
# If file/directory's present, serving it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Else, redirecting the request to the index.php file
RewriteRule . index.php
```

This file will try to see if the file or folder you're trying to access exists in the tree, then if it doesn't exist, it'll redirect the request to the `index.php` entry point in your project.

### Notes

There are a lot of other web services, like NGINX, LigHTTPD or IIS.\
If you want to provide a sample configuration for a server that's not listed here, don't hesitate to fork the repo, do your changes, then submit a pull request.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://siler.leocavalcante.dev/web-servers.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
