web-dev-qa-db-fra.com

RewriteRule pour envoyer toutes les URL contenant `mod` dans le répertoire` moderator`

J'ai un fichier .htaccess dans le répertoire racine de mon projet, qui contient toutes les règles de réécriture du site en fonctions. La plupart de ces règles appartiennent à la section mod du site, et seules deux d'entre elles appartiennent au front-end, que les utilisateurs utilisent.

Le problème, c’est que lorsqu’un utilisateur final utilise le site, Apache finit par respecter toutes les règles, y compris celles relatives aux mods et à l’inscription, etc. J'ai vérifié cela dans le journal .htaccess.

# Mod RewriteRules, some 12 in all 
RewriteRule ^/?(mod)/(all|new|edit|redo|reject)/(Push)/?$ /moderator/index.php?mode=$2&Push=0 [NC,L]
RewriteRule ^/?(mod)/(all|new|edit|redo|reject)/?$ /moderator/index.php?mode=$2 [NC,L]

#signUp - Again, not always needed
RewriteRule ^/?(signup)/?$ /acc/signup/index.php?a=signUp [NC,L]
RewriteRule ^/?(signup)/(process)/?$ /acc/signup/process/index.php [NC,L]

#signIn - Again, not always needed
RewriteRule ^/?(signin)/?$ /acc/signin/index.php?a=signIn [NC,L]
RewriteRule ^/?(signin)/(process)/?$ /acc/signin/process/index.php [NC,L]

#signOut - Again, not always needed
RewriteRule ^/?(signout)/?$ /acc/signout/index.php [NC,L]

# These are the only two that a front end user will use
# category/subCategory
RewriteRule ^/?([a-z-]+)/([a-z0-9-]+)/?$ /display/index.php?t=$1&s=$2 [NC,L]

# category
RewriteRule ^/?([a-z-]+)/?$ /display/index.php?t=$1 [NC,L]

Si vous examinez les règles ci-dessus, les deux dernières sont les seules qu'un utilisateur utilisant le système frontal utilisera. Cependant, ils ne peuvent pas être placés en haut, car ils finiront par attraper quoi que ce soit en premier, à cause de la façon dont ils sont.

Puis-je placer toutes les règles pour le modérateur, l'inscription et la connexion dans leurs propres répertoires, et faire une règle de réécriture dans le fichier racine .htaccess, qui détecte une URL avec mod, comme /mod/all enverra cette demande dans le répertoire moderator. De cette façon, le fichier racine .htaccess n'aura que les deux dernières règles pour l'utilisateur frontal, ainsi que d'autres, comme no hot linking.

Comment puis-je faire quelque chose comme:

If (URL Starts with '/mod/' then send it to the '/moderator/' folder where the RewriteRules there will apply) or
If (URL Starts with '/signup/' then send it to the '/acc/' folder where the RewriteRules there will apply)
and so on.

Ma structure de répertoire est la suivante:

/acc/ ...handles account login and creation
/display/ ... handles front end display
/moderator/ ...the sites administrator

Comment puis-je atteindre cet objectif?

1
Norman

Votre racine .htaccess devrait ressembler à ceci:

# Mod RewriteRules, some 12 in all 
RewriteRule ^mod/(.*)$ /moderator/$1 [NC,L]

RewriteRule ^signup/(.*)$ /acc/signup/$1 [NC,L]

RewriteRule ^signin/(.*)$ /acc/signin/$1 [NC,L]

RewriteRule ^signout/(.*)$ /acc/signout/$1 [NC,L]

# These are the only two that a front end user will use
# category/subCategory
RewriteRule ^/?([a-z-]+)/([a-z0-9-]+)/?$ /display/index.php?t=$1&s=$2 [NC,L]

# category
RewriteRule ^/?([a-z-]+)/?$ /display/index.php?t=$1 [NC,L]

.Htaccess du dossier du modérateur:

RewriteRule ^(all|new|edit|redo|reject)/Push/?$ index.php?mode=$1&Push=0 [NC,L]
RewriteRule ^(all|new|edit|redo|reject)/?$ index.php?mode=$1 [NC,L]

.Htaccess du dossier d'inscription:

RewriteRule ^$ index.php?a=signUp [NC,L]
RewriteRule ^process/?$ process/index.php [NC,L]

Le dossier de connexion .htaccess:

RewriteRule ^$ index.php?a=signIn [NC,L]
RewriteRule ^process/?$ process/index.php [NC,L]

.Htaccess du dossier SignOut:

RewriteRule ^$ index.php [NC,L]

Modifier

Ces règles correspondent aux URL telles que/signup ou/signup/ou/signup/some.

RewriteCond %{REQUEST_URI} ^/mod$ [OR]
RewriteCond %{REQUEST_URI} ^/mod/.*
RewriteRule ^mod(.*)$ /moderator$1 [NC,L]

RewriteCond %{REQUEST_URI} ^/signup$ [OR]
RewriteCond %{REQUEST_URI} ^/signup/.*
RewriteRule ^signup(.*)$ /acc/signup$1 [NC,L]

RewriteCond %{REQUEST_URI} ^/signin$ [OR]
RewriteCond %{REQUEST_URI} ^/signin/.*    
RewriteRule ^signin(.*)$ /acc/signin$1 [NC,L]

RewriteCond %{REQUEST_URI} ^/signout$ [OR]
RewriteCond %{REQUEST_URI} ^/signout/.*    
RewriteRule ^signout(.*)$ /acc/signout$1 [NC,L]
2
Binarysurf