2011-03-25 24 views
8

El problema: Algunas páginas html de equivalentes php (apple.html, apple.php; orange.html, orange.php), pero no todas do (grapes.html).htaccess reescriba si existe un archivo redirigido

El objetivo: si existe la versión de php, vuelva a escribir, de lo contrario, consérvela en la versión html.

que tengo:

Options +FollowSymLinks 
RewriteEngine on 
RewriteRule ^(.*)\.html$ /$1.php [R] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)\.php$ /$1.html [R] 

cuestiones interesantes:

Si no pongo/frente a $ 1.php luego termino con: (site.com/document/root/path es decir: site.com/home/user/www/file.php)

Al llamar al segundo RewriteRule, recibo http://site.com/http:/site.com/page.html y me dice que hubo demasiados redireccionamientos. Observe que solo hay uno/en el segundo http.

He hecho algunos progresos, he agregado RewriteBase/y eliminado el/antes de $ 1, pero sigo recibiendo el error de demasiados redireccionamientos (la página web en site.com/page.html ha provocado demasiados redireccionamientos Limpiar sus cookies para este sitio o permitir cookies de terceros puede solucionar el problema. De lo contrario, posiblemente sea un problema de configuración del servidor y no un problema con su computadora).

Parece que si reescribo html -> php -> html obtengo el mismo error. Entonces parece que la lógica está funcionando, pero ese tipo de lógica no está permitida. No se me ocurre otra forma de ver si existe una "versión php" de un archivo. La única manera que puedo pensar es hacer algo similar a:

RewriteCond ^(.*)\.html$ $1.php -f 
RewriteRule ^(.*)\.html$ $1.php [R] 

Por desgracia, eso no lo hace bastante trabajo (supongo que porque tiene tres segmentos en la línea de estado). Estoy intentando conseguir el nombre del archivo sin la extensión, a continuación, diga si filename.php es un archivo, vuelve a escribir pagina.html a page.php

Respuesta

13

usted debe ser capaz de lograr que mediante el uso de dos condiciones:

RewriteCond %{REQUEST_FILENAME} (.*)\.html$ 
RewriteCond %1\.php -f 
RewriteRule ^(.*)\.html$ $1.php [R,L] 

La primera condición comprueba si el nombre del archivo finalizó con .html y el segundo utiliza la referencia posterior% 1 de la primera condición para verificar si existe la versión .php.

Espero que ayude. :)

+0

Cuando leí por primera vez su email yo era como ah, ja! Entonces lo intenté, y en vano :(Todavía va a page.html incluso si existe el php. ¿Por casualidad significaba $ 1 en lugar de% 1 en el segundo RewriteCond? – user677285

+0

Acabo de probar en mi apache y funciona ¿Estás usando httpd.conf o .htaccess? ¿Publicarás todas tus reglas de reescritura si hay otras? Se supone que el símbolo% se usa en RewriteCond, $ se usa en RewriteRule, al menos esto es lo que recuerdo. :) – szemian

1

Lamento responder muuuy tarde pero tendrá que agregar la directiva RewriteBase para que funcione.

que tenían el mismo problema (con su http:/stufff) y se fija de esta manera:

RewriteBase /your/application_path 
RewriteCond %{REQUEST_FILENAME} (.*)\.html$ 
RewriteCond %1\.php -f 
RewriteRule ^(.*)\.html$ $1.php [L] 

esperan que ayude!

0

También quería Reescribir todas las solicitudes .html a archivos .php, pero solo si existe el archivo .php. Pero mi variación fue que esto solo debería ocurrir si el archivo .html no existe.

De modo que solo las llamadas a archivos .html que no existen se vuelven a escribir en el archivo .php, si existen estas reglas: (¡También he probado esto en un servidor local XAMP y también en un servidor Apache en línea con éxito!)

# Rewrite rules to .html file to .php if the .php version 
# does actually exist. 

RewriteCond %{REQUEST_FILENAME} (.*)\.html [NC] 
RewriteCond %{REQUEST_FILENAME} !-f [NC] 
RewriteCond %1\.php -f [NC] 
RewriteRule ^(.*).html$ $1.php [NC] 
  1. se primer cheque si el archivo solicitado es una.archivo html (no queremos que se vuelva a escribir .jpg, .css, .pdf, etc.)
  2. Comprueba si ese archivo .html no existe. (no queremos reescribir a .php si realmente existe.)
  3. Luego verifica si existe una versión .php (no queremos reescribirla a un archivo .php no existente).
  4. Luego reescribe la .html a .php
Cuestiones relacionadas