1 votes

Règle de réécriture d'Apache sur le dispatcher

Comment puis-je faire une règle de réécriture pour les deux http://example.com/abc à réécrire/réorienter vers http://example.com/abc.html mais cela devrait fonctionner si j'ai l'URL en tant que http://example.com/abc/def.html . Actuellement, lorsque je fais redirect 301 "abc" "abc.hml" la deuxième URL redirige également vers http://example.com/abc.html/def.html .

Mes règles actuelles.

<IfModule rewrite_module>
RewriteEngine On

RewriteRule ^/$ /content/aaa-123/abc.html [PT,L]
RewriteRule ^/index.html$ /content/aaa-123/abc.html [PT,L]
RedirectMatch ^/abc$ /abc.html

RewriteCond %{REQUEST_URI} !^/(.*)/$
RewriteCond %{REQUEST_URI} !^(.*)\.(.*)$

RewriteRule ^/(.*)$ /content/$1/ [L]

RewriteRule \.(css|jpe?g|gif|png|js)$ - [L]

ErrorDocument 404 /errors/404.html    
<IfModule mod_expires.c>
  ExpiresActive on  
ExpiresByType image/jpg "access 1 year"
ExpiresByType image/jpeg "access 1 year"
ExpiresByType image/gif "access 1 year"
ExpiresByType image/png "access 1 year"
ExpiresByType text/css "access 1 month"
ExpiresByType text/html "access 1 month"
ExpiresByType application/pdf "access 1 month"
ExpiresByType text/x-javascript "access 1 month"
ExpiresByType text/css "access plus 1 year"
ExpiresByType application/x-shockwave-flash "access 1 month"
ExpiresByType image/x-icon "access 1 year"
ExpiresDefault "access 1 month"
</IfModule>

<IfModule mod_headers.c>
  <FilesMatch "\.(js|css|xml|gz)$">
    Header append Vary: Accept-Encoding
  </FilesMatch>
</IfModule>

1voto

MrWhite Points 11269

Actuellement, quand je fais redirect 301 "abc" "abc.hml" la deuxième URL redirige aussi vers http://example.com/abc.html/def.html .

Le mod_alias Redirect La directive est correspondance des préfixes ce qui explique votre redirection indésirable.

Mais aussi, ne mélangez pas les redirections des deux mod_alias (c'est-à-dire. RedirectMatch y Redirect ) et mod_rewrite (c'est-à-dire. RewriteRule ). Comme il s'agit de modules différents, ils s'exécutent à des moments différents (généralement mod_rewrite en premier), quel que soit l'ordre apparent, ce qui peut entraîner des conflits déroutants.

Essayez ce qui suit dans la configuration de votre serveur, en interne réécriture /abc a /abc.html

RewriteRule ^/abc$ /abc.html [L]

Cependant, vous aurez des problèmes si /abc est un répertoire physique sur le système de fichiers, car mod_dir essaiera normalement de "corriger" l'URL en y ajoutant un slash. Il faut donc rendre le slash de fin de ligne facultatif :

RewriteRule ^/abc/?$ /abc.html [L]

Aussi, désactivez MultiViews s'il est déjà activé :

Options -MultiViews

MultiViews (qui fait partie de mod_negotiation) fait le même genre de chose (réécriture interne de /abc a /abc.html o /abc.php ou ce qu'il trouve) mais exécutera avant mod_rewrite a une chance.

0voto

eterps Points 7567

Cela a marché pour moi. Quelqu'un m'a aidé à le faire sur le site.

Options -MultiViews
RewriteEngine On

RewriteRule ^/abc/?$ /abc.html [NC,L,R=302]

RewriteRule \.(css|jpe?g|gif|png|js)$ - [L,NC]

RewriteRule ^/(index\.html)?$ /content/aaa-123/abc.html [PT,L,NC]

RewriteCond %{REQUEST_URI} !^/(.*)/$
RewriteCond %{REQUEST_URI} !^(.*)\.(.*)$
RewriteRule ^/(.*)$ /content/$1/ [L]

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X