Zur Navigation

mod_rewrite Regel gesucht

1 subster

Hallo,

ich habe nun eine elendslange Liste an Urls (Migration von anderem Shopsystem) die ich gerne per 301 weiterleiten würde, wenn wir mit einem neuen Shopsystem nächste Woche live gehen.

Ich habe einfach mal die ganz ordinäre redirect 301 /alter/ordner http://ww.domain.de/neuer/ordner/ (die alten urls hatten kein backslash am ende) verwendet.

Die Liste habe ich unten in die .htaccess eingefügt.

Mit Google als Weiterleitungsziel bspw. funktioniert es, jedoch hängt er an die URL am Ende immer den String ?linkurl=/alter/ordner
Im Shop selbst ergibt das jedoch einen 404 Error, da er versucht http://ww.domain.de/neuer/ordner/?linkurl=/alter/ordner aufzurufen.

Dieser Suffix wird anscheinend durch folgende Regel erstellt:

	#RewriteRule ^(.*)(.+)\.html(.*)$ 								commerce_seo_url.php?linkurl=$1$2$3 [qsappend,L]

	RewriteCond %{REQUEST_FILENAME} !\.html$ [OR]
	RewriteCond %{REQUEST_FILENAME} !\.php$ [OR]
	RewriteRule ^(.*)$												commerce_seo_url.php?linkurl=$1 [qsappend,L]

Wie müsste eine mod_rewrite Weiterleitungsregel aussehen, das dder /?linkurl=/alter/ordner Suffix nicht erstellt wird, wobei der oben zitierte Block nicht verändert werden darf?

Vielen Dank für eure Hilfe!

31.05.2012 20:17

2 Jörg

jedoch hängt er an die URL am Ende immer den String ?linkurl=/alter/ordner

Ja, er führt hier dein "qsappend" aus - wenn du nur noch [L] als Flag verwendet, sollte er das nicht mehr machen.

PS: gibt es einen Grund für die vielen Tabstopps in deinem Code :)

31.05.2012 20:43

1 Forenmitglied fand diesen Beitrag gut

3 subster

Vielen lieben Dank, Jörg!

Unglaublich, habe dieses Forum empfohlen bekommen und es ist wahnsinn was hier an Wissen gesammelt wurde!

Wenn qsappend wegnehme, ist aber die eigentliche Funktionsweise des Blocks nicht mehr gewährleistet oder? Also, ich meine, der Programmierer des Codes (der die Vorliebe für die Tabstopps hatte), wird das nicht ohne Grund hinzugefügt haben, oder?

31.05.2012 20:47 | geändert: 31.05.2012 20:48

4 Jörg

Ja, kann sein, dass der Shop die Parameter benötigt.

Du musst dann hier auch mit mod_rewrite weiterleiten, so dass du mit einem [L] ("last") Flag die Ausführung weitere Rewrites verhindern kannst.

Also so z.B. - oberhalb der anderen Rules:

RewriteRule ^alt/(.*) http://example.com/neu/$1/ [L,301]

31.05.2012 20:57

1 Forenmitglied fand diesen Beitrag gut

5 subster

Vielen Dank!

Leider gibt mir diese Regel einen Error 500.
Ich habe es nun an etlichen Stellen versucht, sogar mit deiner unveränderten Regel.

Hast du eventuell einen Stundensatz um mir eine funktionierende Regel zu schreiben und dir das mal genauer anzusehen?

Falls nicht, bin ich aber auch dankbar für jegliche Hilfe bei weiteren Eigenversuchen.

31.05.2012 21:38

6 Jörg

Hast du eventuell einen Stundensatz um mir eine funktionierende Regel zu schreiben und dir das mal genauer anzusehen?

Ja, du kannst mich dazu anmailen (siehe Impressum)

Falls nicht, bin ich aber auch dankbar für jegliche Hilfe bei weiteren Eigenversuchen.

Um den Fehler nachzuvollziehen, wäre es hilfreich, wenn du den gesamten Inhalt der htaccess Datei postest (Domainnamen kannst du durch example.com ersetzen)

31.05.2012 22:21

7 subster

okay, einen Versuch starte ich noch, falls du mir deine Hilfe noch einmal zuteil kommen lassen würdest:


AuthName "Restricted Area" 
AuthType Basic 
AuthUserFile /home/essendbu/dev.essenza-nobile.de/.htpasswd 
AuthGroupFile /dev/null 
require valid-user

AddDefaultCharSet utf-8

# Wenn Sie 1und1 benutzen, setzen Sie die nächsten beiden Zeilen aktiv (Einschalten PHP5)
#AddType x-mapp-php5 .php
#AddHandler x-mapp-php5 .php

# Expire headers 31536000 Sekunden = 1 Jahr
<IfModule mod_expires.c>
	ExpiresActive On
	ExpiresDefault "access plus 31536000 seconds"
	ExpiresByType image/x-icon "access plus 31536000 seconds"
	ExpiresByType image/gif "access plus 31536000 seconds"
	ExpiresByType image/jpg "access plus 31536000 seconds"
	ExpiresByType image/jpeg "access plus 31536000 seconds"
	ExpiresByType image/png "access plus 31536000 seconds"
	ExpiresByType text/css "access plus 31536000 seconds"
	ExpiresByType text/javascript "access plus 31536000 seconds"
	ExpiresByType application/javascript "access plus 31536000 seconds"
	ExpiresByType application/x-javascript "access plus 31536000 seconds"
	ExpiresByType image/ico "access plus 31536000 seconds"
	ExpiresByType text/html "access plus 31536000 seconds"
</IfModule>

# BEGIN Cache-Control Headers
<ifmodule mod_headers.c>
	<filesmatch "\\.(ico|jpe?g|png|gif|swf)$">
	Header set Cache-Control "max-age=31536000, public"
	</filesmatch>
	<filesmatch "\\.(css)$">
	Header set Cache-Control "max-age=31536000, public"
	</filesmatch>
	<filesmatch "\\.(js)$">
	Header set Cache-Control "max-age=31536000, public"
	</filesmatch>
	<filesmatch "\\.(ico)$">
	Header set Cache-Control "max-age=31536000, public"
	</filesmatch>	
</ifmodule>

<ifmodule mod_deflate.c>
<FilesMatch "\\.(js|css|html|htm|php|xml|jpg|jpeg|png|gif)$">
SetOutputFilter DEFLATE
</FilesMatch>
</ifmodule>




<ifmodule mod_gzip.c>
    mod_gzip_on       Yes   
    mod_gzip_dechunk  Yes   
	mod_gzip_minimum_file_size    500
	mod_gzip_maximum_file_size    500000
	mod_gzip_maximum_inmem_size   60000
	mod_gzip_min_http             1000
	mod_gzip_handle_methods        GET POST
	mod_gzip_item_exclude         reqheader  "User-agent: Mozilla/4.0[678]"
    mod_gzip_item_include file      \.(html?|txt|css|js|php|pl)$   
    mod_gzip_item_include handler   ^cgi-script$   
    mod_gzip_item_include mime      ^text/.*   
    mod_gzip_item_include mime      ^application/x-javascript.*   
	mod_gzip_item_include mime       ^text/html$
	mod_gzip_item_include mime       ^text/css$
	mod_gzip_item_include mime       ^text/js$
	mod_gzip_item_include mime       ^image/jpeg$
	mod_gzip_item_include mime       ^image/png$
	mod_gzip_item_include mime       ^image/gif$
	mod_gzip_item_include mime       ^text/plain$
	mod_gzip_item_include mime       ^httpd/unix-directory$	
    mod_gzip_item_exclude mime      ^image/.*   
    mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*   
</ifmodule>

# Turn ETags Off
<ifmodule mod_headers.c>
	Header unset ETag
</ifmodule>
FileETag None

# Zusatzparameter PHP
#php_value max_execution_time 60000
#php_value memory_limit 160M
#php_value arg_separator.output &amp;

# Dateiauflisting unterbinden
Options -Indexes

# Kommentieren Sie diese Zeile aus, wenn Sie einen Fehler 500 (Internal Server Error) erhalten
#Options +FollowSymlinks

<IfModule mod_rewrite.c>
	RewriteEngine On 

	#Sicherheit
	## Begin - Rewrite rules to block out some common exploits.
	# If you experience problems on your site block out the operations listed below
	# Block out any script trying to base64_encode data within the URL.
	RewriteCond %{QUERY_STRING} base64_encode[^(]*\([^)]*\) [OR]
	# Block out any script that includes a <script> tag in URL.
	RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR]
	# Block out any script trying to set a PHP GLOBALS variable via URL.
	RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
	# Block out any script trying to modify a _REQUEST variable via URL.
	RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
	# Return 403 Forbidden header and show the content of the root homepage
	RewriteRule .* index.php [F]
	#
	## End - Rewrite rules to block out some common exploits.
	RewriteRule w00tw00t\.at\. - [F,L]

	Options +SymLinksIfOwnerMatch
	

	# Umleitung auf Adresse mit www, wenn www fehlt und nicht Subdomain und nicht localhost und nicht ssl.webpack.de
	RewriteCond %{HTTP:X-Forwarded-Server} 	!^ssl\.webpack\.de$ [NC]
	RewriteCond %{HTTP:X-Forwarded-Server} 	!^sslsites\.de$ [NC]
	RewriteCond %{HTTP_HOST}   				!^www\..* [NC]
	RewriteCond %{HTTP_HOST}   				!^.*\..*\..* [NC]
	RewriteCond %{HTTP_HOST}   				!^localhost(.*)$ [NC]
	RewriteRule ^(.*)          				http://www.%{HTTP_HOST}/$1 [R=301,L]

	# immer auf den root verweisen, damit die Startseite (/index.php) nicht zweimal vorkommt
	# die folgenden beiden Zeilen auskommentieren wenn Sie eine index.html nutzen wollen
	RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.(html?|php)\ HTTP/
	RewriteRule ^index\.(html?|php)$ http://%{HTTP_HOST}/ [R=301,L]

	# Editieren Sie die untenstehende Zeile wenn ihr Shop in einem Unterordner läuft.
	# Aber auch wenn Sie einen Fehler 500 (Internal Server Error) bekommen.
	# Beispiel: Ist ihr Shop im Verzeichnis www.domain.de/shop ändern Sie die Zeile wie folgt: "RewriteBase /shop/"
	#RewriteBase /
	
	RewriteCond %{REQUEST_FILENAME} -f [OR]
	RewriteCond %{REQUEST_FILENAME} -d

	RewriteRule ^(.+) - [PT,L]
	
	RewriteCond %{REQUEST_URI} !(.*)/$
	RewriteCond %{REQUEST_URI} !\..+$
	RewriteCond %{REQUEST_URI} !/$
	RewriteRule (.*) http://%{HTTP_HOST}/$1/ [R=301,L]

	RewriteRule ^(.*)(.+)404.php$								404.php [qsappend,L]

	RewriteRule ^(.*)tag/(.*([a-zA-Z0-9]))/$ taglisting.php?tag=$1$2 [qsappend,L]
	#RewriteRule ^(.*)keywords/(.*([a-zA-Z0-9]))$					advanced_search_result.php?keywords=$1$2 [qsappend,L]
	#RewriteRule ^(.*)manufacturer-(.*[0-9])/(.*([a-zA-Z0-9]))$		index.php?manufacturers_id=$2 [qsappend,L]
	RewriteRule ^(.*)review-(.*[0-9])/(.*([a-zA-Z0-9]))\.html$		product_reviews_info.php?reviews_id=$2 [qsappend,L]
	#RewriteRule ^(.*)(.+)\.html(.*)$ 						commerce_seo_url.php?linkurl=$1$2$3 [qsappend,L]

	RewriteCond %{REQUEST_FILENAME} !\.html$ [OR]				RewriteCond %{REQUEST_FILENAME} !\.php$ [OR]
	RewriteRule ^(.*)$								commerce_seo_url.php?linkurl=$1 [qsappend,L]
</IfModule>

31.05.2012 22:30

8 subster

Der 500 Error kam durch [L,301]

Ich habe nun dieses Schema versucht und es ist für Kategorien erfolgreich:

RewriteRule ^old/(.*) http://example.com/new/$1/ [QSA,R=301,L]

Allerdings die Produkturls darunter geben wieder 404 Errors aus.

01.06.2012 09:06

9 Jörg

Zitat von subster
Der 500 Error kam durch [L,301]

Ja, sorry, das war ein Fehler meinerseits :-/ korrekt ist natürlich [L,R=301]

Ich habe nun dieses Schema versucht und es ist für Kategorien erfolgreich:

RewriteRule ^old/(.*) http://example.com/new/$1/ [QSA,R=301,L]

Allerdings die Produkturls darunter geben wieder 404 Errors aus.

Wie sehen die Produkt-URLs denn nach der Weiterleitung aus und wie sollten sie stattdessen aussehen?

01.06.2012 09:34

10 subster

Guten Morgen!

Oh, da ist kein Schema drin.

Hier ein Beispiel:


RewriteRule ^raumduefte/parfums-d-orsay-paris/(.*) http://www.domain.de/raumduefte/Parfums-dOrsay-Paris$1/ [QSA,R=301,L]

RewriteRule ^raumduefte/parfums-d-orsay-paris/parfums-d-orsay-bois-de-cotton-duftkerze http://www.domain.de/raumduefte/Parfums-dOrsay-Paris$1/ [QSA,R=301,L]

Der Einfachheit halber und um die htaccess nicht gigantisch aufzublähen versuche ich die Produkturls auf die jeweils passenden Kategorien zu leiten.

01.06.2012 09:46