2010-10-15 5 views
1

J'ai des fichiers statiques html sur mon serveur. Je veux que les règles d'accès -Aide à la réécriture d'URL en utilisant .htaccess

  1. Si l'utilisateur visite http://example.com/test/ il devrait obtenir le contenu du fichier http://example.com/test.html
  2. Si l'utilisateur visite http://example.com/test (sans slash), il est redirigé vers http://example.com/test/ (qui exécute la règle 1 et obtient le contenu du fichier test.html)
  3. Les règles 1 et 2 ne doivent être déclenchées que si le fichier test.html existe.

Jusqu'à présent, j'ai -

Options All -Indexes -Multiviews 
# Do not return details of server 
ServerSignature Off 

<IfModule mod_rewrite.c> 
DirectorySlash Off 
RewriteEngine On 
RewriteBase/

# If it's a request to index.html 
RewriteCond %{THE_REQUEST} \ /(.+/)?index\.html(\?.*)?\ [NC] 
# Remove it. 
RewriteRule ^(.+/)?index\.html$ /%1 [R=301,L] 

# Add missing trailing slashes to directories if a matching .html does not exist. 
RewriteCond %{SCRIPT_FILENAME}/ -d 
RewriteCond %{SCRIPT_FILENAME}.html !-f 
RewriteRule [^/]$ %{REQUEST_URI}/ [R=301,L] 

# If it's a request from a browser, not an internal request by Apache/mod_rewrite. 
RewriteCond %{ENV:REDIRECT_STATUS} ^$ 
# And the request has a HTML extension. Redirect to remove it. 
RewriteRule ^(.+)\.html$ /$1 [R=301,L] 

# If the request exists with a .html extension. 
RewriteCond %{SCRIPT_FILENAME}.html -f 
RewriteRule ^(.*)/?$ $1.html [QSA,L] 
</IfModule> 

Bien que cela fonctionne pour http://example.com/test, il échoue pour http://example.com/test/ (500 erreur interne)

Si pas la seconde dernière ligne prendre soin des barres obliques de fuite ?

[Mise à jour] Si j'utilise des suggestions Gumbo (.htaccess ci-dessous), je reçois un 404 pour les deux http://example.com/test et http://example.com/test/ (avec slash)

Options All -Indexes -Multiviews 
# Do not return details of server 
ServerSignature Off 

ErrorDocument 404 /404.html 

# Hide .htaccess 
<Files ~ "^\.ht"> 
Order allow,deny 
Deny from all 
</Files> 

<IfModule mod_rewrite.c> 
DirectorySlash On 
RewriteEngine On 
RewriteBase/

RewriteCond %{REQUEST_FILENAME}.html -f 
RewriteRule ^[^/]+$ %{REQUEST_URI}/ [L,R=301] 
RewriteRule ^([^/]+)/$ $1.html [L] 

</IfModule> 

[Mise à jour 2] I ont abandonné. Le code ci-dessous fonctionne, mais au lieu de forcer tout avec un/(http://example.com/test/), il supprime la barre oblique finale (http://example.com/test). Du bon côté, cela garantit que le contenu ne soit pointé que par une URL, ce qui préserve le référencement. Je vais vivre avec pour l'instant.

Options All -Indexes -Multiviews 
# Do not return details of server 
ServerSignature Off 

ErrorDocument 404 /404.html 

# Hide .htaccess 
<Files ~ "^\.ht"> 
Order allow,deny 
Deny from all 
</Files> 

<IfModule mod_rewrite.c> 
DirectorySlash On 
RewriteEngine On 
RewriteBase/

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+)/$ /$1 [R=301,L] 

# If the request exists with a .html extension. 
RewriteCond %{SCRIPT_FILENAME}.html -f 
# And there is no trailing slash, rewrite to add the .html extesion. 
RewriteRule [^/]$ %{REQUEST_URI}.html [QSA,L] 


</IfModule> 

Répondre

2

Essayez ces règles:

RewriteCond %{REQUEST_FILENAME}.html -f 
RewriteRule ^[^/]+$ %{REQUEST_URI}/ [L,R=301] 
RewriteRule ^([^/]+)/$ $1.html [L] 
+0

Désolé, 404s pour les deux http://example.com/test et http://example.com/test/ – pravin

+0

@pravin: Oh, le fixe . – Gumbo

+0

Désolé, toujours 404s – pravin