2010-09-05 8 views
0

Je le code suivant dans mon .htaccess:Mod Rewrite production 404 Lorsque Chenilles (fonctionne très bien vus dans le navigateur)

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

Mon joli lien de conversion est fait sur mon index.php. Si l'utilisateur recherche quelque chose qui n'existe pas, un en-tête 404 est produit, sinon le contenu est affiché.

Tout cela est bien et dandy, mais quand un crawler ou quelque chose essaie d'afficher le code HTML, ils reçoivent une erreur 404.

Par exemple:

http://www.jasonleodurbin.com/portfolio Ce lien devrait fonctionner correctement.

Si vous essayez de le valider avec un validateur HTML, cela ne fonctionne pas. Le crawler dit qu'il obtient un 404. Je reçois la même chose pour le partage de Facebook.

J'ai essayé de supprimer l'en-tête d'erreur 404, et je reçois toujours le même problème.

Quelle est l'affaire? Aucune suggestion?

EDIT:

Nouveau .htaccess:

RewriteEngine On 
RewriteCond %{HTTP_HOST} ^jasonleodurbin\.com$ [NC] 
RewriteRule ^(.*)$ http://www.jasonleodurbin.com/$1 [R=301,L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([a-z]+)/$ index.php?go=$1&app=1 [NC,L,QSA] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([a-z]+)?success=true index.php?go=$1&success=1 [NC,L,QSA] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([a-z]+) index.php?go=$1 [NC,L,QSA] 

Traitement:

globals.php

if(!isset($_GET['go']) || $_GET['go'] == "") $_GET['go'] = "home"; 

header.php

if(isset($_GET['go']) && [email protected](strtolower($_GET['go']).".php",'r')){ 
    //header("HTTP/1.0 404 Not Found"); 
    define("FAIL",true); 
    $_GET['go'] = "error"; 
} 
else { 
    define("FAIL",false); 
Header('HTTP/1.1 200'); 
} 
if(FAIL) define("GOSUB",DIR); 
if(isset($_GET['app'])) define("GOSUB","../"); 
else define("GOSUB",""); 

J'ai aussi essayé cela pour le index.php:

<?Header('HTTP/1.1 200 OK');?> 
<? require_once("header.php");?> 
<? require_once(strtolower($_GET['go'].".php"));?> 

    </div> 
</div> 
<? 
    if(!defined("FOOTER"))define('WP_USE_THEMES', false); 
    define("FOOTER",true); 
    include("blog/index.php"); 
?> 
<!--[if IE]> 
<a href='http://www.google.com/chrome' title='Get Google Chrome : A Better Way To Browse' class='noie sprite-1'>IE Sucks</a> 
<![endif]--> 
<!--[if lt IE 7]> 
<div style='position:absolute;top:60px;left:0px;'><b>IE 6</b>?! Dude, upgrade. <br>Click the link above to get Google Chrome.</div> 
<![endif]--> 
</body> 
</html> 

Quelque chose envoie le 404 avant que je puisse même envoyer 200

Répondre

1

Vous utilisez apparemment Wordpress. Wordpress définit n'importe quelle page qu'il ne trouve pas comme 404.

Vous pouvez également être intéressé par plugin Link Juice Keeper. Il redirige toutes les 404 pages vers la première page en utilisant la redirection 301. Et voici Wordpress 404 tips and tricks.

+0

J'utilise WordPress pour le/blog sub. – Jason

+0

@Jason, pouvez-vous poster le contenu de votre fichier index.php? S'il s'agit de votre fichier .htaccess, il doit être placé dans le répertoire/blog sinon wordpress prendra le contrôle des pages. – shamittomar

+0

Je vais éditer mon post original avec mon .htaccess édité et le traitement que je fais. – Jason

1

je reçois la page de portefeuille montrer, mais avec un en-tête 404. Donc, vérifiez le code qui définit l'en-tête 404, l'erreur est quelque part là-dedans.

Il me semble que vous utilisez fopen seulement pour voir si le fichier existe (s'il ne s'ouvre pas, il n'existe pas). Utilisez file_exists() pour cela: http://php.net/file_exists

+0

Merci, j'ai changé le file_exists(). Toujours pas de solution pour le 404. – Jason

0

Etes-vous sûr qu'il n'y a pas d'autre endroit dans le code où un autre 404 peut-être envoyé? si aucun autre trouve, alors il semble être un problème avec votre configuration, essayez d'envoyer un en-tête opposé 200 OK lorsque la page est approuvée.

BTW ne pas faire fopen(strtolower($_GET['go']), l'utilisateur peut mettre à $_GET['go']http://his.domain.com/page, et vous vous retrouvez notamment une page de son serveur si les configurations de PHP permettent que (allow_url_fopen).

+0

J'ai aussi essayé le 200. Toujours rien. – Jason

+0

Peut-être que ça ne va pas la route 200? essayez 'var_dump (FAIL)' pour vous assurer du chemin que l'exécution va suivre. p.s. vérifier ma réponse je l'ai édité en ajoutant une note importante. – aularon

+0

Où serait la configuration bizarre? J'utilise aussi la même idée sur les autres sites que je maintiens. http://www.geoffduncanphotography.com/portfolio (par exemple) La seule différence est qu'ils ne sont pas dans le dossier public_html. Ils sont tous dans des dossiers séparés. Cela pourrait-il être un problème? – Jason