Simone: .htaccess Umleitung

Hallo,

Ich möchte Jobanzeigen welche bei der Agentur für Arbeit verlinkt sind auf eine aktualisierte Jobanzeige per .htaccess umleiten.

Das Schema:

https://www.domain.de/job/11265/

leitet auf:

https://www.domain.de/job/11265-1/

Das letzte Numerische Muster / Zahl der URL stellt die letzte Version der Stellenausschreibung dar.

11265-1 = erste Aktualisierung 11265-2 = zweite Aktualisierung 11265-3 = dritte Aktualisierung

Es ist derzeit noch ungewiss wieviel Änderungen an der Stellenausschreibung erfolgen (max. 10) werden.

Die Regel sollte folgendes leisten:

Wenn die URL https://www.domain.de/job/11265/ abgerufen wird und nicht vorhanden leite weiter an:

https://www.domain.de/job/11265-1/ wenn nicht vorhanden -> leite weiter an: https://www.domain.de/job/11265-2/ wenn nicht vorhanden -> leite weiter an: https://www.domain.de/job/11265-3/ wenn nicht vorhanden -> leite weiter an:

bis

https://www.domain.de/job/11265-10/ wenn nicht vorhanden -> leite weiter per 301 an die Startseite.

Ich hoffe ich konnte die Sache / Problemstellung verständlich wiedergeben bzw. beschreiben.

Alternativ könnte ich auch auf ein PHP-Script zurückgreifen.

wenn https://www.domain.de/job/(.*)/ nicht vorhanden leite an Script weiter... das sollte jedoch nur die "Notoption" darstellen.

Beste Grüße Simone

  1. @@Simone

    https://www.domain.de/job/11265/

    Verwende bitte für Beispiele die dafür gemäß RFC 2606 vorgesehenen Domains.

    🖖 Живіть довго і процвітайте

    --
    When the power of love overcomes the love of power the world will know peace.
    — Jimi Hendrix
  2. Also. Umleitung eines Requests von

    https://www.example.org/job/11265/
    

    je nach Verfügbarkeit zu

    https://www.example.org/job/11265-n/
    

    wobei n eine aufsteigende natürliche Zahl ist.

    Frage: Findet denn schon eine Umleitung statt (so sieht es nämlich aus) und wie wurden die Dateien(Daten) auf dem Dateisystem tatsächlich abgelegt? Was passiert TATSÄCHLICH, wenn https://www.example.org/job/11265/ bzw. https://www.example.org/job/11265-1/ abgerufen wird?

    Deine Formulierung* „Wenn die URL https://www.example.org/job/11265/ abgerufen wird und nicht vorhanden“* geht insoweit ins Leere, als dass das „R" in „URL“ für „Request“ steht - und eine Frage ist nach allen Regeln der Logik vorhanden sobald sie gestellt wurde…

    Die Umleitungsregeln für den Apache kann man durchaus an das Vorhandensein realer Dateien (meinetwegen Dateisystemobjekten wie Dateisystem-Links) knüpfen, ansonsten würde ich empfehlen, für das „Verzeichnis“ /job/ mit einem speziellen Skript auf den 404er Fehler zu reagieren, welches die Version sucht, die richtige URL zusammenbaut und dann mit dem dann korrekten Statuscode weiterleitet.

    1. Hi,

      [...] dass das „R" in „URL“ für „Request“ steht

      ach tatsächlich? Das wäre mir neu.

      Einen schönen Tag noch
       Martin

      --
      Wer andern eine Bratwurst brät,
      braucht wohl ein Bratwurstbratgerät.
      1. Mag ja sein, dass es auch für Ressource steht, aber im Hinblick auf die gestellte Frage erscheint Dein Einwand „als nicht zielführend“.

      2. @@Der Martin

        [...] dass das „R" in „URL“ für „Request“ steht

        ach tatsächlich? Das wäre mir neu.

        Aber dass das „L“ in „URL“ für „Location“ steht, das weißt du schon? SCNR.

        🖖 Живіть довго і процвітайте

        PS: Nein, steht es nicht.

        --
        When the power of love overcomes the love of power the world will know peace.
        — Jimi Hendrix
    2. Vielen Dank für Deine Antwort!

      Frage: Findet denn schon eine Umleitung statt.

      Ja, definitiv als CMS läuft WordPress, also gibt es physikalisch keine statische Datei auf dem Server...

      # BEGIN WordPress
      RewriteEngine On
      RewriteBase /
      RewriteRule ^index\.php$ – [L]
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule . /index.php [L]
      # END WordPress
      

      https://www.example.org/job/11364/ = https://www.example.org/job/POST-ID/

      Wollte jedoch auf einen Wordpress Hook verzichten, da ich mich nicht auskenne.

      Für mich einfacher währe eine Weiterleitung an ein PHP Script wenn eine 301 vorliegt.

      <?php 
      $url = "https://www.example.org/job/12235-1/";
      
      
      
      
      echo "<pre>";
      print_r(getHttpCode( $url ));
      echo "</pre>";
      
      
      
      function getHttpCode( $url )
      {
          $ch = curl_init();
      
          
          curl_setopt($ch, CURLOPT_URL, $url);
          curl_setopt($ch, CURLOPT_HEADER, 1);
          curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      
          curl_exec($ch);
          $info = curl_getinfo($ch);
          curl_close($ch);
      
          return $info;
      }
      
      /*
      Array
      (
          [url] => https://www.example.org/job/12235-1/
          [content_type] => text/html; charset=UTF-8
          [http_code] => 200
          [header_size] => 561
          [request_size] => 84
          [filetime] => -1
          [ssl_verify_result] => 0
          [redirect_count] => 0
          [total_time] => 0.605774
          [namelookup_time] => 0.012258
          [connect_time] => 0.012335
          [pretransfer_time] => 0.021711
          [size_upload] => 0
          [size_download] => 195165
          [speed_download] => 322174
          [speed_upload] => 0
          [download_content_length] => -1
          [upload_content_length] => 0
          [starttransfer_time] => 0.604257
          [redirect_time] => 0
          [redirect_url] => 
          [primary_ip] => *****
          [certinfo] => Array
              (
              )
      
          [primary_port] => 443
          [local_ip] => ******
          [local_port] => ***
      )
      
      
      Array
      (
          [url] => https://www.example.org/job/12235/
          [content_type] => text/html; charset=UTF-8
          [http_code] => 301
          [header_size] => 416
          [request_size] => 82
          [filetime] => -1
          [ssl_verify_result] => 0
          [redirect_count] => 0
          [total_time] => 0.276097
          [namelookup_time] => 0.004331
          [connect_time] => 0.004517
          [pretransfer_time] => 0.03001
          [size_upload] => 0
          [size_download] => 0
          [speed_download] => 0
          [speed_upload] => 0
          [download_content_length] => 0
          [upload_content_length] => 0
          [starttransfer_time] => 0.276072
          [redirect_time] => 0
          [redirect_url] => https://www.example.org
          [primary_ip] => 85.*****
          [certinfo] => Array
              (
              )
      
          [primary_port] => 443
          [local_ip] => *****
          [local_port] => ***
      )
      

      Beste Grüße Simone

      1. Wollte jedoch auf einen Wordpress Hook verzichten, da ich mich nicht auskenne.

        Ich will das (mich mit Wordpress auskennen) auch nicht. Aber es gibt sicher Spezis dafür. Deswegen hab ich mal den Titel geändert.

        In dem von Dir genannten Szenario müsstes Du die erforderlichen Regeln in der .htaccess-Datei zwischen den von Wordpress gesetzten Regeln einpflegen und das können womöglich viele werden. (Wie viele Jobs habt ihr denn im Angebot?)

        Inwieweit das dann Updates von Wordpress „überlebt“ (die können ja auch eine .htaccess mitbringen) weiß ich auch nicht.

        Ich empfehle eine Automatisierung.

        Noch besser wäre es aber, an der Stelle anzusetzen, wo Wordpress einen 404er sendet, wenn Wordpress das nicht selbst tut kann statt der Standard-404er-(Not Found)-Seite ein PHP-Skript starten, welches das korrekte und verfügbare „Dokument“ in der Datenbank sucht, die URL bastelt und die Weiterleitung veranlasst.

        1. Hallo Raketenwilli,

          Ich empfehle eine Automatisierung.

          Und ich empfehle, die Aufgabenstellung auf ihren Sinngehalt zu prüfen. Wieso müssen im Wordpress die alten Versionen stehen bleiben? Warum kann man nicht unter der verlinkten URL jeweils die aktuelle Jobbeschreibung ablegen?

          Wenn man unbedingt eine Versionierung will - warum nicht Wordpress Revisions? Ich habe keine Ahnung von WP - aber die Frage in den Raum stellen möchte ich doch mal.

          Wenn Revisions für den Zweck untauglich ist - gibt es eine brauchbare Alternative als Plugin?

          Wenn auch das nicht geht: manuelle Versionführung geht immer - man kopiere den aktuellen Stand von /foo/job4711 sofort nach Fertigstellung am 28.10.2022 auf /foo/job4711-20221028. Oder man macht die Kopie vor der nächsten Änderung.

          Die angedachte .htaccess Akrobatik - vor allem mit einer Kette von bis zu 10 Redirects - finde ich sehr untauglich. Wenn es eine "File Exists" Abfrage gibt, muss man das rückwärts tun, d.h. wenn job4711 abgerufen wird, prüft man der Reihe nach job4711-10, job4711-9, job4711-8, etc, bis job4711-1 und job4711. Und sobald man was findet, leitet man dorthin. Das führt allerdings zu einer Menge "Existiert diese Datei" Abfragen und mag auf einem stark belasteten Server nicht empfehlenswert sein.

          Rolf

          --
          sumpsi - posui - obstruxi
          1. d.h. wenn job4711 abgerufen wird, prüft man der Reihe nach job4711-10, job4711-9, job4711-8, etc, bis job4711-1 und job4711. Und sobald man was findet, leitet man dorthin. Das führt allerdings zu einer Menge "Existiert diese Datei" Abfragen und mag auf einem stark belasteten Server nicht empfehlenswert sein.

            Ja auch deswegen habe ich ein Problem damit, das mit .htaccess lösen zu wollen.

            Aber da wären

            glob()

            Sollte das in Wordpress nicht nur eine Datenbankabfrage, etwa wie diese sein?

            SELECT `this`, `that`
            FROM `foo`
            WHERE `FakedDirName` LIKE 'job4711%'
            ORDER BY `FakedDirName` DESC
            LIMIT 1
            

            (Ich kenne weder die Tabellen noch die Spaltennamen, noch den tatsächlichen Inhalt...)

            Wie auch immer: Macht man das in PHP, dann hat man schöne Möglichkeiten, muss sich aber mit Wordpress auskennen - und da bin ich nicht dabei.

  3. Hallo,

    für die Nachwelt ;o)

    Beste Grüße Simone

    add_action( 'init', 'add_custom_weiterleitung' );
    
    function add_custom_weiterleitung()
    {
    
    	/*
    	if (! is_user_logged_in() ) 
    	{
    		return;
    	}
    	*/
    	
    	if (!is_user_logged_in()) 
    	{
    		global $permalink_manager_uris;	// alle URLs vom Permalink Plugin 			
    
    		
    		if(!empty($_SERVER['SCRIPT_URL']) AND !empty($permalink_manager_uris))
    		{
    			if(preg_match('/job\/([0-9]+)\/?$/', $_SERVER['SCRIPT_URL'], $output_array))
    			{
    				// prüft ob die Struktur der URL = 
    				// job/112234 ist 
    				$job_url = 	trim($_SERVER['SCRIPT_URL'],'/'); 
    
    				if (!in_array($job_url ,$permalink_manager_uris))
    				 {
    					/*
    					
    						echo "<pre>";
    						print_r($output_array);
    						echo "</pre>";			
    
    					Array
    					(
    						[0] => job/1267/
    						[1] => 1267
    					)
    
    					*/
    
    					if(!empty($permalink_manager_uris[$output_array[1]]))
    					{
    						$weiter_zu_url ='https://www.example.org/'.$permalink_manager_uris[$output_array[1]].'/';
    						wp_redirect( $weiter_zu_url, 301);
    					}
    				}			
    			}
    		}
    	}	
    }