web-dev-qa-db-fra.com

Utilisation de mod_speling avec htaccess multi-niveaux et rewriterules

Nous avons récemment changé de format pour gérer nos 301. Dans l’ensemble, tout s’est bien passé, mais cela semble avoir empêché mod_speling de fonctionner correctement. Voici ce que nous avons changé:

Ancien /var/www/html/.htaccess:

RewriteEngine on
RewriteBase /

# Change SHTML to HTML
RewriteRule ^(.*)\.shtml$ $1.html [R=permanent,L]

# Change PCF to HTML ('cause, you know, we probably have CMS users like that...)
RewriteRule ^(.*)\.pcf$ $1.html [R=permanent,L]

# Force WWW subdomain for all requests
RewriteCond %{HTTP_Host} !^www.example.edu$ [NC]
RewriteRule ^(.*)$ http://www.example.edu/$1 [R,L]

# User accounts are on Sun.example.edu
RedirectMatch ^/~(.*)$ http://Sun.example.edu/~$1

# Remove index.html at the end of URLs
RewriteCond %{REQUEST_URI} ^(.*/)index\.html$ [NC]
RewriteRule . %1 [R=301,NE,L]

Redirect 301 /academics/calendar2012-13.html http://www.example.edu/academics/calendar.html
Redirect 301 /academics/departments/   http://www.example.edu/majors/
Redirect 301 /academics/Pre-Medical.pdf http://www.example.edu/academics/Pre-Medicine.pdf
Redirect 301 ...

Nouveau /var/www/html/.htaccess:

RewriteEngine on
RewriteBase /

# Change SHTML to HTML
RewriteRule ^(.*)\.shtml$ $1.html [R=permanent,L]

# Change PCF to HTML ('cause, you know, we probably have CMS users like that...)
RewriteRule ^(.*)\.pcf$ $1.html [R=permanent,L]

# Force WWW subdomain for all requests
RewriteCond %{HTTP_Host} !^www.example.edu$ [NC]
RewriteRule ^(.*)$ http://www.example.edu/$1 [R,L]

# User accounts are on Sun.example.edu
RedirectMatch ^/~(.*)$ http://Sun.example.edu/~$1

# Remove index.html at the end of URLs
RewriteCond %{REQUEST_URI} ^(.*/)index\.html$ [NC]
RewriteRule . %1 [R=301,NE,L]


RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*) 404/$1

Et puis nous avons ajouté un nouveau fichier à /var/www/html/404/.htaccess:

RewriteEngine on
RewriteBase /404

RewriteRule ^academics/calendar2012-13.html$    /academics/calendar.html    [R=302,L]
RewriteRule ^academics/departments/$    /majors/    [R=301,L]
RewriteRule ^academics/Pre-Medical.pdf$ /academics/Pre-Medicine.pdf[R=301,L]
RewriteRule ...

J'ai un accès (basé sur Webmin) au fichier httpd.conf (même si nous ne voulons pas y stocker tous nos 301, si possible). Nous utilisons Apache 2.2.15 sur RHEL 6 sur un serveur de notre propre centre de données.

Comme je l'ai dit, le seul problème que nous voyons est que mod_speling ne fait plus sa magie. Le nouveau format présente tellement d'avantages par rapport à l'ancien que nous ne voulons vraiment pas revenir en arrière, mais mod_speling est tellement agréable d'avoir ce que nous aimerions aussi que cela fonctionne si possible. Des idées sur la façon dont nous pourrions résoudre mod_speling?

3
michaelcgorman

mod_speling et mod_rewrite appliquent leurs règles au cours de la même phase. Si rewrite touche une URL, elle ne sera généralement pas transmise à mod_speling. Vous pouvez utiliser l'indicateur "passer par" [PT] sur n'importe quelle règle de réécriture empêchant mod_speling de jouer son rôle magique. Si l'indicateur [PT] est en place, alors mod_speling peut toujours faire son travail.

L'autre chose que je fais est de mettre en place un script pour le gestionnaire 404. Cela me permet d'examiner l'URL dans le script et d'émettre des redirections en fonction de règles telles que la sensibilité à la casse, la troncature pouvant être déduite, les caractères ajoutés après ".html", etc. J'ai arrêté d'utiliser mod_speling lorsque j'ai découvert que je pouvais implémenter un gestionnaire 404 qui fonctionnait mieux avec les erreurs 404 que j'avais en réalité.

1
Stephen Ostermiller