it-swarm-es.com

¿Configurando WordPress con Permalinks personalizados y sin archivo .htaccess?

Tengo un cliente que prefiere desactivar los archivos .htaccess porque les gusta establecer las configuraciones de Apache. Sin embargo, todavía quieren URLs amigables para SEO.

¿Hay una manera de tener permalinks personalizados sin archivo .htaccess? Mi investigación hasta ahora parece indicar que esto no es posible, pero tal vez uno de los desarrolladores brillantes sepa cómo lo imposible parece ser posible. ¡Gracias por adelantado!

7
Mike Lee

Hola @Mike Lee :

Para responder a tu pregunta es útil entender cómo funciona todo.

Apache sirve direcciones URL que coinciden con archivos y directorios

Apache está diseñado para servir archivos coincidentes explícitamente por URL, o para servir el index.php encontrado en un directorio cuando el directorio coincide explícitamente.

Pero Apache puede servir URL combinadas por Regex con mod_rewrite

Si desea que Apache coincida con las URL donde no hay directorios reales (en el caso de WordPress y los enlaces permanentes), debe tener alguna forma de decirle a Apache cómo manejar las URL de manera diferente. Y eso es exactamente lo que mod_rewrite fue diseñado para permitir; les brinda a los administradores de servidores la capacidad de establecer reglas para hacer coincidir las URL usando expresiones regulares. Esas reglas dirigen el resultado a otras URL, que a menudo incluyen en realidad archivos .PHP y, a veces, con parámetros de URL pasados. En última instancia, las reglas especifican que los archivos reales se cargan.

Y mod_rewrite se configura con .htaccess o httpd.conf

Para configurar mod_rewrite, solo puede hacerlo dentro de .htaccess o dentro del archivo httpd.conf o uno de los archivos que incluye, como potencialmente httpd-vhosts.conf. En realidad, me sorprende que su cliente tenga las habilidades para controlar a Apache porque aún no lo saben.

WordPress siempre utiliza el mismo archivo simple .htaccess

Pasando a lo que hace WordPress, cuando establece los enlaces permanentes, WordPress escribe lo siguiente en el archivo .htaccess, asumiendo que se puede escribir (y en este primer ejemplo, suponiendo que su sitio web se sirve desde la raíz):

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Advertencia: cuando su directorio de la página principal de WordPress no es raíz

Si su sitio se sirve desde /blog entonces el archivo .htaccess escrito se vería así:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /blog/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /blog/index.php [L]
</IfModule>

WordPress enruta todas las URL que no coinciden con el archivo/directorio a index.php

Entonces, como puede ver, lo único que WordPress usa .htaccess es mapearcualquieraURL del dominio a /index.php (o /blog/index.php en el segundo ejemplo)exceptocuando una URL coincide con un archivo real (como .jpg/.gif/.png image, una .css stylesheet, una .js code, etc.) o cuando coincide con un directorio real (que, por lo que yo sé, es no es relevante en una instalación estándar de WordPress.)

En PHP WordPress analiza $_SERVER['REQUEST_URI'] para decidir qué cargar

Dentro de su código PHP, WordPress toma el valor de $_SERVER['REQUEST_URI'] que contiene la solicitud de URL completa sans el dominio y el esquema (es decir, el esquema es http o https) y luego analiza el valor para determinar qué URL se solicitó y, por lo tanto, qué páginas que debería cargar.

Eludir .htaccess? Haz que Apache cargue las URL virtuales (¡pero buena suerte con eso!)

Entonces, si desea omitir de alguna manera .htaccess, su trabajo sería hacer que Apache responda a una URL arbitraria, luego cargar WordPress y configurar $_SERVER['REQUEST_URI'] para que sea la ruta URL más los parámetros; IOW lo engaño pero de buena manera. Dicho esto, sé que si no conozco ninguna forma que no sea demasiado complicada para hacer eso.

Incrustar /index.php/ (¿Quizás?!?)

A pesar de que * Chris_O * está en lo correcto al añadir /index.php/ a tus URLs, me estremezco cada vez que veo eso. Agrega 10 caracteres a cada URL, lo que los hace más largos y menos significativos para los motores de búsqueda, pero mucho peor los hace menos compartibles y se ve críptico para los usuarios. Lo siento, Chris, sé que hablabas en serio, pero ugh!

Crear directorios reales para cada URL (¿Quizás?)

Una forma de obtener los enlaces permanentes bonitos sin tocar Apache sería escribir un script que generaría un directorio real para cada URL que desee y luego almacenar un index.php allí que cargaría WordPress. Por supuesto, eso supondría un gran esfuerzo por un pequeño beneficio y requeriría que el servidor tenga acceso de escritura, lo que tiene que ser peor que usar un archivo .htaccess.

Odio admitirlo, pero esto es lo que hice en 1998 con un sitio web basado en .ASP- cuando IIS no era compatible con la reescritura de URL (¡e incluso hoy en día es un PITA real!) Fue un truco feo, fue un dolor mantenerlo y Lo odiaba, ¡pero las URL eran geniales para ambos usuarios y para SEO!

¿Mejor solución? Añadir reglas de reescritura a httpd.conf

De vuelta a lo que probablemente sea la mejor solución, y @Simon Brown realmente lo recomendó; agregue sus reglas de reescritura a httpd.conf o uno de los archivos de inclusión como httpd-vhosts.conf (que es la forma en que Apache está configurado en localhost en mi Mac). Agregue la siguiente directiva asegurándose de cambiar el directorio para que coincida con el directorio de su sitio:

<Directory "/home/example_user/public_html/">
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</Directory>

¡Prima! Con bloqueo viene también el rendimiento

Esta última opción debería eliminar cualquier .htaccess y volver a poner el control en sus manos. Aún mejor, tiene un poco más de rendimiento ya que httpd.conf solo se carga una vez cuando se inicia Apache pero los archivos.htaccess se cargan y se analizan en cada solicitud de URL)

PD Una cosa más a considerar sería a front-end Apache con un servidor de almacenamiento en caché como Nginxque creo que se está convirtiendo en una mejor práctica para sitios de WordPress de alto tráfico que realmente necesitan ser ejecutante Es posible que se necesiten ajustes en el campo verde porque no creo que la mayoría de la gente haya estado utilizando Nginx para reescribir la URL de Apache, pero si esa dirección le interesa, aquí hay algunos enlaces a seguir:

15
MikeSchinkel

Enlaces permanentes sin mod_rewrite

Sin un archivo .htaccess o sin modificar su archivo httpd.conf, lo mejor que puede hacer es permalinks pathinfo. Los permalinks de Pathinfo son los mismos que los permalinks bonitos, excepto que comienzan con index.php.

Para usar los permalinks de pathinfo, coloque index.php/al inicio de su estructura personalizada de permalink:

/index.php/%postname%/

Vea el artículo del Codex para más información.

2
Chris_O

De vuelta en los viejos tiempos, WordPress necesitaba escribir un nuevo archivo de configuración cada vez que cambiaba la estructura del enlace permanente. En las configuraciones modernas, las RewriteRules no cambian:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Todas las solicitudes de archivos no existentes (es decir, una ruta de enlace permanente personalizada que no coincide con un archivo en el sistema de archivos) pasan a través de index.php, y $_SERVER['REQUEST_URI'] le dice a PHP lo que realmente se solicitó. Tu cliente puede configurar las reglas de reescritura en httpd.conf o .htaccess, y no necesitarás modificarlo a medida que modifiques la estructura del enlace permanente.

Algunos complementos intentan modificar ellos mismos .htaccess o le piden que modifique el archivo. Esta solución puede no ser para todos, pero vale la pena considerarla.

0
Annika Backstrom