# Exercice : un script CGI pour Apache

Vous avez déployé du contenu .html sur mon serveur `unixshell.hetic.glassworks.tech` dans [un exercice précédent](/unix-shell/configurer-apache/exercice1.md).

On peut aussi demander à Apache, au lieu juste de servir un fichier static, d'exécuter un script et renvoyer le résultat de ce script.

En pratique, Apache va récupérer le résultat du `stdout` de notre script, et le renvoyer au client.

Pour ce faire, il y aura quelques modifications à apporter :

1. Dans votre fichier `.htaccess` il faut activer l'exécution des scripts via le module `cgi` :

```bash
Options +ExecCGI
AddHandler cgi-script .cgi
```

> Si vous avez configuré vous même votre serveur Apache, il faut être sur d'avoir activé la lecture de `.htaccess`. Vous l'activez, site par site, dans `/etc/apache2/sites-enabled/000-default.conf` :
>
> ```bash
> <VirtualHost *>
>   ...
>   <Directory /var/www/html/>
>     # Cette ligne autorise que .htaccess soit lu 
>     AllowOverride All
>     Options -Indexes
>     DirectoryIndex disabled
>   </Directory>
>   ...
> </VirtualHost>
> ```
>
> Ensuite, vous redémarrez Apache avec : `systemctl restart apache2`

1. Ensuite on crée un script avec extension `.cgi`. Par exemple, `index.cgi` :

```bash
#!/bin/bash

# EN-TÊTE
# Dans le standard HTTP, on est obligé de retourner une ligne avec le type de contenu
echo "Content-Type: text/plain"
# Suivi par une ligne vide
echo ""

# CORPS
# Ensuite, on peut faire notre logique et envoyer notre contenu.
# Ici, on va juste retourner un peu de text

echo "This is the result of a script!"
```

1. Modifiez les droits de ce fichier pour le rendre exécutable :

```bash
chmod 755 index.cgi
```

> A noter, si vous êtes administrateur de ce serveur, il faut d'abord activer le module CGI avec :
>
> ```bash
> a2enmod cgi
> ```

Vous pouvez ensuite consulter ce fichier à :

```
https://unixshell.hetic.glassworks.tech/[IDENTIFIANT]/index.cgi

# A noter [IDENTIFIANT] est votre adresse e-mail avec le @ remplacé par un .
```

Rédigez un fichier text qui s'appelle "greeting.txt" et qui contient un message de bienvenue pour votre visiteur, par exemple:

```bash
Bonjour, vous êtes bienvenue !
```

Adaptez le script `index.cgi` pour lire ce fichier (avec `cat` par exemple), et renvoyer le résultat à l'utilisateur. L'idée est qu'on puisse modifier les contenus du fichier `greeting.txt` sans devoir modifier notre script.

Malgré le contenus de notre fichier `greeting.txt`, il faut toujours terminer la page avec le texte : `Fin de page!`.

Est-ce que les caractères spéciaux s'afficher correctement ? Comment résoudre ce problème ?

<details>

<summary>Solution</summary>

```bash
#!/bin/bash

echo "Content-Type: text/plain; charset=utf-8"
echo ""

cat greeting.txt

echo "Fin de page!"
```

</details>


---

# 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://docs.glassworks.tech/unix-shell/scripts/210-scripts/exercice.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.
