Mamphil hat geschrieben:ich sehe nicht, wieso /joke/82/ funktionieren sollte - es sei denn, du hast noch ein Verzeichnis /joke/ mit einer zusätzlichen .htaccess
Sein Server hat Content Negotiation eingeschaltet, so dass der Apache automatisch die den Browser-Wünschen entsprechende Datei aussucht. Beim Aufruf von "bla.html" würde der Server zum Beispiel von den beiden Dateien bla.html.de und bla.html.en die deutschsprachige Fassung bla.html.de ausliefern, falls der Browser signalisiert, sein Herr und Gebieter bevorzuge die deutsche Sprache.
In diesem Fall wird für beim Aufruf der URL /joke die Resource joke.php ausgewählt.
Weiterhin kommt hinzu, dass offenkundig die Option Path Info ebenfalls aktiviert ist. Beim Aufruf eines wie auch immer „lebendigen“ Inhalts, wie eben ein PHP-Skript, lässt sich an den Skriptnamen noch weiterer Krams verzeichnismäßig anhängen. Man kann also /bla.php/123/456 aufrufen, es wird das Skript bla.php ausgeführt und bekommt in der Variablen PATH_INFO den Text /123/456 übergeben.
Content Negotiation und Path Info zusammen führen dazu, dass man hier /joke/82/Horse-power aufrufen kann. Für /joke wird joke.php ausgewählt, und das kein Witz kommt, liegt daran, dass joke.php einen URL-Parameter jokeid erwartet, nicht die Variable PATH_INFO.
Es eröffnen sich somit zwei Lösungsmöglichkeiten:
1.
mod_rewrite über Bord kippen und Skript für PATH_INFO umschreiben.
2.
Wie du schon vorgeschlagen hattest, dies in /.htaccess
RewriteEngine on
RewriteBase /
RewriteRule ^jokes/([0-9]+) joke.php?jokeid=$1 [R=302]
und schauen, ob und wenn ja, an welche URL weitergeleitet wird. Falls keine Weiterleitung erfolgt, passt das Muster nicht; dann Muster testweise kürzen, zum Beispiel
RewriteRule ^jokes joke.php?jokeid=82 [R=302]
(Nicht kürzer als jokes machen, dann gibt's eine Endlosschleife.)