2013-10-27 11 views
7

Ich versuche, ein paar mod_rewrite Regeln zu schreiben. Im Moment läuft alles gut. Im Moment schauen meine generische URLs wie folgt aus:Mod_rewrite überprüfen, ob PHP-Datei existiert

http://website.com/about-us 
http://website.com/privacy 

Im Moment sind diese zwei Links mod_rewritten zu content.php, weil about-us und privacy nicht als .php-Dateien vorhanden sind, sondern vielmehr wird ihr Inhalt gespeichert in eine Datenbank, die content.php abruft.

Ich habe eine andere url:

http://website.com/contact-us 

, die als Php-Datei nicht existiert, weil es benutzerdefinierte Daten enthält. Wie kann ich überprüfen, ob contact-us.php existiert? Ist dies der Fall, umleiten website.com/contact-us-website.com/contact-us.php, andernfalls Umleitung zu website.com/content.php

Unten ist mein mod_rewrite-Datei, wie es steht:

RewriteEngine On 

# I want the following condition and rule to look to see if the .php file exists, 
# and if it does, redirect to the physical page, otherwise, redirect to content.php 
RewriteCond %{DOCUMENT_ROOT}/([a-zA-Z0-9\-_]+).php -f 
RewriteRule ^([a-zA-Z0-9\-_]+)\.php$ [L] 


RewriteRule ^([a-zA-Z0-9\-_]+)$ /content.php [L] 
RewriteRule ^(product1|product2|product3)/(designer1|designer2|designer3)$ /search.php?productType=$1&designer=$2 [L] 
RewriteRule ^sale/(product1|product2|product3)$ /search.php?sale=1&productType=$1 [L] 

Wenn Sie weitere Informationen benötigen, lassen Sie es mich wissen! schätze ich die Antworten :)

Antwort

9

ändern .htaccess Code

RewriteEngine On 

RewriteCond %{REQUEST_FILENAME} !-d # not an existing dir 
RewriteCond %{REQUEST_FILENAME} !-f # not an existing file 
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}\.php -f # and page.php exists 

# redirect to the physical page 
RewriteRule ^(.*)$ $1.php [L] 

# otherwise, redirect to content.php 
RewriteRule^/content.php [L] 

RewriteRule ^sale/(product[123])$ /search.php?sale=1&productType=$1 [QSA,NC,L] 
RewriteRule ^(product[123])/(designer[123])$ /search.php?productType=$1&designer=$2 [QSA,NC,L] 

Ich habe auch das Muster für andere RewriteRule s passend vereinfache. Beachten Sie die Verwendung von [QSA], um zusätzliche Abfrageparameter automatisch weiterzuleiten, und [NC], um die Übereinstimmung der Groß-/Kleinschreibung zu berücksichtigen.

+0

Danke für die Antwort leider sein mit einem 500 internen Serverfehler kommt :( –

+0

Entfernen Sie das '/' 'zwischen% {DOCUMENT_ROOT}% {REQUEST_URI}' –

+0

Schauen Sie sich auch das einfachere Muster an, das für Ihre anderen 'RewriteRules' passt –

1

Ich würde verwenden:

# 
# redirect first the evidences: 
# 
RewriteRule ^(product1|product2|product3)/(designer1|designer2|designer3)$ /search.php? productType=$1&designer=$2 [L] 
RewriteRule ^sale/(product1|product2|product3)$ /search.php?sale=1&productType=$1 [L] 

# 
# redirect then the generality: 
# 
RewriteCond %{DOCUMENT_ROOT}%%{REQUEST_URI}.php -f 
RewriteRule^%{DOCUMENT_ROOT}%%{REQUEST_URI}.php [L] 

# 
# all other requests are rewritten to /content.php: 
# 
RewriteRule^/content.php [L] 
Verwandte Themen