2009-11-19 10 views
0

Après un jour ou deux, je me bats toujours avec Mod Rewrite. Il semble que 60% de mon temps de développement est consacré à la lutte contre le serveur.Mod Rewrite ignorer -d

Ma structure d'URL actuelle est telle que tous les http://example.com/xyz et http://example.com/xyz/abc doivent être gérés par index.php. Le problème est que j'ai une section http://example.com/admin/, qui est un véritable répertoire que je dois être accessible par requête HTTP (il est le répertoire CMS)

Lorsque je tente de parcourir la CMS http://example.com/admin/, il change mon URL http://example.com/admin/?n=admin et renvoie un 404. Mon index.php reçoit n = admin comme argument.

Ce que je ne comprends pas est pourquoi ces deux conditions sont ignorées.

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !^admin(?:\/)?$ 

Et pourquoi je reçois redirigeant à http://example.com/admin/?n=admin (plutôt que simplement arrêter à http://example.com/admin/

Options +FollowSymlinks 
RewriteEngine On 
RewriteBase/

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !^admin(?:\/)?$ 

# allow access to certain subdirectories. 
RewriteRule ^admin(?:\/)?$ /admin/ [L,NC] 

# redirect all old URLs to new pages (or 404 sitemap page if no analog?). 
RewriteRule ^company/about(?:\/)?$ /company [R=301,L,NC] 

# catch any others and try to serve them right 
RewriteRule ^/?(.+).html$ /$1 [R=301,L] 

RewriteRule ^/?([0-9]+)(?:\/)?$ /index.php?p=$1 [L] 
RewriteRule ^/?([-a-zA-Z0-9_+]+)(?:\/)?$ /index.php?n=$1 [L] 
RewriteRule ^/?([-a-zA-Z0-9_+]+)/([-a-zA-Z0-9_+]+)(?:\/)?$ /index.php?n=$2 [L] 

Can quiconque offre des idées ou signaler les défauts dans le .htaccess?

+0

Pour résumer ma question, je ne peux pas accéder à un répertoire qui existe sur le serveur, car le réécriture du mod me redirige. Cela ne devrait pas arriver parce que je mets RewriteCond% {REQUEST_FILENAME}! -d –

+0

Question à essayer, change l'avant-dernier ou le dernier Règle de ... php? N = ... à ... phph? M = ... pour voir quelles règles sont en vigueur. Aussi comment est-ce que vous dites qu'il redirige vers admin /? N = admin, mais vous référez à index.php obtenir le paramètre n = admin –

Répondre

0

Chaque RewriteCond applique seulement la prochaine RewriteRule.Ainsi, seule votre première Règle est conditionnée.

Vos options sont à répéter les règles, ou faire alors finale et la sortie (ne me souviens drapeau pour cette ma tête)

+0

Cela suggérerait que cela fonctionnerait: RewriteCond% {REQUEST_FILENAME} -f RewriteCond% {REQUEST_FILENAME} -d RewriteCond% {REQUEST_FILENAME}^admin (?: \ /)? $ RewriteRule^(.?) $ $ 1 [L] Mais ce n'est pas? –

+0

En fait, cela devrait fonctionner, mais ne fonctionne pas: RewriteCond% {REQUEST_FILENAME} -f [OR] RewriteCond% {REQUEST_FILENAME} -d [OR] RewriteCond% {REQUEST_FILENAME}^admin (: \ /)? $ RewriteRule^(.?) $ $ 1 [l] –

+0

Je suis toujours très sûr que votre première règle ne correspondra jamais, comme vous l'état avec « si le chemin est pas un fichier et le chemin est pas répertoire et le chemin n'est pas admin/ou admin "alors si le chemin est" admin/ou admin "réécrire à"/admin/" Ainsi, aucun changement net, en raison de la précédente pas. –

0

Essayez cette règle avant vos autres règles:

RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule^- [L] 

Cela mettra fin à le processus de réécriture si le chemin demandé peut être mappé à un répertoire existant. La même chose s'applique lorsque vous utilisez -f à la place.