[httpd] Émulation de RewriteMap
#1

Bonjour à tous et toutes,

Je me demandais si il y avait une façon avec OpenBSD HTTPD d'utiliser une liste de redirections à l'instar de Apache, avec la directive RewriteMap?

Le but étant d'avoir des URLs courts qui mènent vers des permaliens:

Code :
C /note/2017/09/lesbricodeurs-replyto-status-909427743573577728.html
2 /note/2018/02/the-radical-idea-of-a-world-without-jobs.html
2 /note/2017/04/fait-le-respirer-un-peu-ton-code.html
28 /note/2017/03/vider-le-filelist-dun-input-type-file.html

Donc https://hugo.soucy.cc/C est un alias de https://hugo.soucy.cc/note/2017/09/lesbr...77728.html.

Mon générateur de site statique crée automatiquement le fichier .txt avec les URLs.

J'héberge maintenant mon site à la maison sur OpenBSD, avant j'étais avec un VPS qui utilisait Apache.

Merci et bonne journée!

---
Répondre
#2

Salut.
Ça semble tout à fait possible, mais il faudrait que ton fichier ressemble plutôt à :

Code :
location "/C" { block return 301 "https://$SERVER_NAME/note/2017/09/lesbricodeurs-replyto-status-909427743573577728.html" }

Voici un script écrit à l'arrache pour convertir ton fichier généré par ton générateur. Tu lui donne à manger ton fichier d'url :
Code :
sh test.sh url.txt > rewrite_httpd.txt
le fichier rewrite_httpd.txt contiendra un truc comme ça :
Code :
location "/C" { block return 301 "https://$SERVER_NAME/C" }
location "/2" { block return 301 "https://$SERVER_NAME/2" }
location "/2" { block return 301 "https://$SERVER_NAME/2" }
location "/28" { block return 301 "https://$SERVER_NAME/28" }
Il faut l'inclure avec l'option "include" de httpd.

Le script :
Code :
#!/bin/sh
sn='$SERVER_NAME'
while read -r line; do
    short="$(echo ${line} | awk '{print $1}')"
    long="$(echo ${line} | awk '{print $1}')"
    echo "location \"/$short\" { block return 301 \"https://$sn/$long\" }"
done < $1
Répondre
#3

Bonjour prx,

Merci pour ton aide, ça fonctionne très bien Smile

Toutefois j'ai un petit souci ... Il semble que dans les redirections il n'y a pas de distinctions entre les caractères majuscules ou minuscules.

Donc `/C` est redirigé au même endroit que `/c`; la lettre minuscule l'emporte.

En Unix nous sommes habituellement sensible à la case, alors j'en conclu que c'est une implémentation coté navigateur ... ?

Est-ce qu'il y a moyen de forcer cela avec la conf?

Merci encore et bonne journée!

---
Répondre
#4

ça me fait plutôt penser à un bug
Répondre
#5

(28-08-2019, 17:19:55)solene a écrit :  ça me fait plutôt penser à un bug

Hello Solène,

Ok, mais à quel niveau tu crois?

Je me demande si sur Apache je n'avais pas le même comportement? Je me souviens m'avoir demandé pourquoi un URL de redirection ne pointait pas sur le bon contenu ... Il y a un certain temps de cela.

Merci et à bientôt.

---
Répondre
#6

Ah oui, ça ressemble bien à un bug, et un tout vilain Confused

Avec "location match "/..." , ça donne quoi?
Répondre
#7

(28-08-2019, 17:36:30)prx a écrit :  Ah oui, ça ressemble bien à un bug, et un tout vilain Confused

Avec "location match "/..." , ça donne quoi?

Voilà ce que ça donne ... et tous les URLs que je fournis sont redirigés ver https://hugo.soucy.cc/note/2017/12/openb...ussie.html ... Et le navigateur retourne le message ci-dessous:

Citation :The page isn’t redirecting properly

An error occurred during a connection to hugo.soucy.cc.

This problem can sometimes be caused by disabling or refusing to accept cookies.

Sinon, voici ce à quoi mes règles de redirections resssembles maintenant (fichier shortlinksmap.txt):

Code :
location match "/4j" { block return 301 "https://$SERVER_NAME/note/2018/12/please-support-mozilla.html"}
location match "/3m" { block return 301 "https://$SERVER_NAME/file/pgp.html"}
location match "/4p" { block return 301 "https://$SERVER_NAME/note/2019/01/for-the-love-of-pipes.html"}
location match "/2f" { block return 301 "https://$SERVER_NAME/note/2017/03/si-les-etats-unis-envahissaient-le-canada.html"}
location match "/4t" { block return 301 "https://$SERVER_NAME/note/2019/04/rss-is-better-than-twitter.html"}
location match "/3z" { block return 301 "https://$SERVER_NAME/note/2018/04/est-ce-que-facil-a-une-canal-irc.html"}
location match "/3G" { block return 301 "https://$SERVER_NAME/note/2018/04/cryptoqc-temoignage-de-zuckerberg.html"}
location match "/2G" { block return 301 "https://$SERVER_NAME/note/2016/09/why-we-use-progressive-enhancement-to-build-gov-uk.html"}
location match "/n" { block return 301 "https://$SERVER_NAME/note/2017/12/openbsd-mise-a-jour-reussie.html"}

---
Répondre
#8

Essaie avec "location match "^/2G" "?
Répondre
#9

(29-08-2019, 14:31:51)prx a écrit :  Essaie avec "location match "^/2G" "?

Quand j'écris directement les redirections ça fonctionne:

Code :
location match "/c" { block return 301 "https://$SERVER_NAME/note/2018/01/an-introduction-to-the-indieweb.html"}
location match "/C" { block return 301 "https://$SERVER_NAME/note/2017/09/lesbricodeurs-replyto-status-909427743573577728.html"}

Mais il semble que c'est avec le "include" ça ne fonctionne mal.

Code :
server "hugo.soucy.cc" {
        listen on * tls port 443

        root "/htdocs/hugo.soucy.cc"

        tls {
            certificate "/etc/ssl/hugo.soucy.cc-fullchain.pem"
            key "/etc/ssl/private/hugo.soucy.cc.key"
        }
        hsts

        location "/.well-known/acme-challenge/*" {
                root "/acme"
                request strip 2
        }

        include "/var/www/htdocs/hugo.soucy.cc/shortlinksmap.txt"

        }

Est-ce que j'inclue le fichier correctement? j'ai cherché des exemples qui ressemble à ça, mais ce fût infructueux.

---
Répondre
#10

Je ne vois pas d'erreur, mais quelque chose m'échappe sûrement.
Et si l'include est juste après hsts ? (coup d'épée dans l'eau...)
Répondre
#11

À relire ce matin le manpage de httpd.conf, je n'ai pas l'impression/le sentiment que la déclaration include serve à inclure un fichier de configuration à l'intérieur d'une déclaration de configuration 'server'.

Il me semble, mais je peux me tromper, - à contrario de nginx - que dans le cas de httpd, elle sert à inclure les fichiers de configuration dans lesquels tu déclares tes différents "serveurs", et pas pour autre chose !
Elle fait partie des Types d'inclusion, et permet d'appeler ainsi différentes configurations serveurs. ou différents types de fichiers de définitions, tels que 'mime.types'.
(mais, je peux certainement dire/écrire une bêtise).

GPG:Fingerprint ed25519 : **072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E**
GPG:Fingerprint rsa4096 : **4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733**
Répondre
#12

@PengouinBSD : non non, on peut inclure n'importe quoi n'importe où :

(extrait qui tourne en ce moment-même)
Code :
server "www.ybad.name" {
    include "/etc/httpd.d/listentls.conf"
    include "/etc/httpd.d/listenhttp.conf"
    block return 301 "https://ybad.name$REQUEST_URI"
    no log
}

server "ybad.name" {
    include "/etc/httpd.d/listenhttp.conf"
    block return 301 "https://$SERVER_NAME$REQUEST_URI"
    no log
}

server "ybad.name" {
    include "/etc/httpd.d/listentls.conf"
        root "/htdocs/ybad.name"
    directory index index.html
    log access "ybad.name.log"
    log error "ybad.name.log"
    log style combined

    include "/etc/httpd.d/acme.conf"

    location "/atom.xml" { block return 301 "https://$SERVER_NAME/feed.atom" }

    location "/Images/*" { directory auto index }
    location "/DL/*" { directory auto index }

    location "/Cours/*" {
        authenticate "Cours" with "/htdocs/educ.htpw"
        directory auto index
    }
    location "/private/*" {
        authenticate "private" with "/htdocs/educ.htpw"
        directory auto index
    }
    location match "/idiotbox" {
                root "/cgi-bin/idiotbox.cgi"
                fastcgi
        }
    location "/*.html" { include "/etc/httpd.d/sbw.conf" }
    location "/*.css" { include "/etc/httpd.d/sbw.conf" }
    location "/*.js" { include "/etc/httpd.d/sbw.conf" }
    location "/*.svg" { include "/etc/httpd.d/sbw.conf" }
    location "/*.xml" { include "/etc/httpd.d/sbw.conf" }
    location "/*.atom" { include "/etc/httpd.d/sbw.conf" }
    location "/*.txt" { include "/etc/httpd.d/sbw.conf" }
    location "/*/" { include "/etc/httpd.d/sbw.conf" }
}

server "dev.ybad.name" {
    log access "ybad.name.log"
    log error "ybad.name.log"
    include "/etc/httpd.d/listentls.conf"
    include "/etc/httpd.d/listenhttp.conf"
    root "/htdocs/gitreps"
    include "/etc/httpd.d/acme.conf"
    directory auto index
}

server "autoconfig.ybad.name" {
    include "/etc/httpd.d/listenhttp.conf"
    root "/htdocs/autoconfig/ybad.name/"
}


server "opz3dwzcv5of6l4ockz6pljr6ta6evr5xkg34lvurxa45lbkibi2j5yd.onion" {

    listen on localhost port 80
        root "/htdocs/ybad.name"
    directory index index.html
    log access "ybad.name.log"
    log error "ybad.name.log"
    log style combined

    location "/atom.xml" { block return 301 "https://$SERVER_NAME/feed.atom" }

    location "/Images/*" { directory auto index }
    location "/DL/*" { directory auto index }

    location "/educ/*" {
        authenticate "Cours" with "/htdocs/educ.htpw"
        directory auto index
    }
}
Répondre
#13

(30-08-2019, 20:19:52)prx a écrit :  Je ne vois pas d'erreur, mais quelque chose m'échappe sûrement.
Et si l'include est juste après hsts ? (coup d'épée dans l'eau...)

Salut prx,

Ok, je vais essayer ça, on ne sait jamais.

Mais là j'ai un autre problème ... de chez-moi je n'arrive plus à accéder à cette machine - connecté au même router/modem - tant par https que par ssh.

J'ai vérifier le parfeu du routeur et pf.conf et pourtant rien ne semble avoir changé ... de l'extérieur de la maison ça fonctionne. Qu'est-ce qu cela peut bien être??

---
Répondre
#14

Que tu n'arrives pas à te connecter par HTTP, ne m'étonnes pas... mais en ssh, directement, c'est bizarre ?

Pour HTTP, c'est normal en soit, étant donné que tu es sur ton réseau local, il te faut dire à ton routeur, dans tes règles PF, que ton réseau local, du moins ta machine cliente peut interroger sur IPv4 ta machine serveur. C'est un classicisme. (à moins que je ne me trompe).
Bref, c'est comme si tu crées une route et l'autoriser.
Est-ce que tu régis IPv6 ? apparemment, non ; car là, normalement cela devrait fonctionner.

Code :
$ dig hugo.soucy.cc +short
45.58.106.26

$ dig hugo.soucy.cc +short AAAA
$

$ curl -I6 hugo.soucy.cc
curl: (6) Could not resolve host: hugo.soucy.cc

$ curl -I4 hugo.soucy.cc
HTTP/1.0 301 Moved Permanently
Date: Wed, 04 Sep 2019 03:35:11 GMT
Server: OpenBSD httpd
Connection: close
Content-Type: text/html
Content-Length: 443
Location: https://hugo.soucy.cc/

$ curl -I4 https://hugo.soucy.cc
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 10963
Content-Type: text/html
Date: Wed, 04 Sep 2019 03:36:23 GMT
Last-Modified: Fri, 30 Aug 2019 17:22:52 GMT
Server: OpenBSD httpd
Strict-Transport-Security: max-age=31536000

GPG:Fingerprint ed25519 : **072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E**
GPG:Fingerprint rsa4096 : **4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733**
Répondre
#15
Thumbs Up 

(29-08-2019, 14:31:51)prx a écrit :  Essaie avec "location match "^/2G" "?

Bon après plusieurs mois en jachère et le déménagement de ce forum - ça m'a pris d'ailleurs quelques minutes avant de vous retrouver Smile - Je me suis repenché sur le problème.

J'ai finalement allumé en relisant la (sainte-)documentation, la différence entre
Code :
location match
et
Code :
location
tout court.


J'ai alors simplement ajouté un $ à la fin de mon pattern:

Code :
location match "^/2G$" { block return 301 "https://$SERVER_NAME/note/2016/09/why-we-use-progressive-enhancement-to-build-gov-uk.html"}

Puis dans mon script pour raccourcir les URLs j'ai retiré le tiret dans les caractères disponibles, pour le remplacer par le souligné.

Et tout roule.

Merci à tous et toutes qui on participé à cette discussion qui s'est un peu trop étiré dans le temps Big Grin

---
Répondre
#16

Salut,

Merci de ton retour Smile
Répondre
#17

@hSoucy : Bien vu ; le pire c'est que je le savais !
Content que tu avances… :p

GPG:Fingerprint ed25519 : **072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E**
GPG:Fingerprint rsa4096 : **4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733**
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)