plugin - wordpress add meta keywords
Wordpress y regla de reescritura de CI en htaccess (4)
He instalado WordPress en example.com. También instalé CodeIgniter en la carpeta ci
aquí example.com/ci/
, ci
es el nombre de la carpeta, register
es el nombre del controlador y la URL de trabajo de CI es example.com/ci/register
. Mi URL base comienza con https: //.
Ahora tengo un URL de WordPress example.com/hotel
, el hotel
es la página que he creado en el administrador de WordPress, funciona bien.
Quiero ejecutar la ruta de mi CI como example.com/hotel/ci/register
, creo que podemos hacerlo con alguna regla de reescritura para que mi URL se vea como example.com/hotel/ci/register
. He agregado htaccess
para wordpress que me redirige aquí example.com/hotel/ci/register
. Me está mostrando el 404 error
de CI. Significa que ahora estoy en CI. Ahora hice cosas siguientes en el archivo routes.php
.
$route[''default_controller''] = ''register'';
$route[''404_override''] = ''register'';
Ahora esta URL example.com/hotel/ci/register
está funcionando, pero esta no es la forma correcta, la próxima vez que haya más controladores, entonces no funcionará.
Nota : No puedo crear una carpeta de hotel porque hotel es una página en WordPress. Si creo una carpeta de hotel
, WordPress URL example.com/hotel/ no funcionará. Redirigirá la página de WordPress a la carpeta del hotel
. Así que tengo que hacerlo sin crear carpeta de hotel
. Tenga en cuenta example.com = myurl.com.
Necesito encontrar otra buena solución. ¿Algún consejo u orientación sería muy apreciado?
La siguiente es mi regla de reescritura en wordpress htaccess
:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^/?hotel/ci/register(/.*)?$ /ci/$1 [L]
RewriteRule ^index/.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
Y a continuación es mi IC htaccess
:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond $1 !^(index/.php|resources|robots/.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L,QSA]
</IfModule>
Creo que estás en el camino correcto, prueba esto:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^/hotel/ci(/.*)?$ /ci/$1 [L] # remove the register part
# so that it would be handled by CI
# also remove the "?" in front of hotel
RewriteRule ^index/.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
mantén tu IC htaccess tal como es:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond $1 !^(index/.php|resources|robots/.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L,QSA]
</IfModule>
la última parte es hacer coincidir su config.php
CI con su nuevo modelo de url
$config[''base_url''] = "http://example.com/hotel/ci/";
No creo que esta sea la gran respuesta de su pregunta, pero si me encuentro con el mismo problema, usaré las routes
consulte el código de ejemplo.
$route[''(:any)/ci/register''] = "register";
lo que hará el código anterior (:any)
significa cualquier palabra en el primer uri y después de eso, puede definir cualquier url que desee. Definí ci/register
. También puede hacerlo así.
$route[''(:any)/register''] = "here_you_can_add_your_controller/function";
Esto funcionará si se golpea la URL de esta manera.
http://www.example.com/any_word_you_want/register
golpeará su función de control. Necesita hacer
echo
algo y se mostrará en su navegador.
También puede definir la palabra de hotel en su url base como @ am05mhz muestra en su respuesta, pero no creo que sea una buena idea porque en el futuro puede tener 2 palabras más en su url.
Nota: el ejemplo del código anterior solo funciona si su .htaccess
da acceso a las rutas como muestra en su pregunta, el .htaccess
es un trabajo para usted. Para obtener un conocimiento completo de las rutas, consulte la documentación del código URI codeigniter
Problema interesante! Configuré un contenedor de Docker con una nueva instalación de Wordpress y Codeigniter, creé una página de hotel
en WP, un controlador de Register
y una vista en CI, y obtuve las pruebas. Pasé demasiado tiempo en esto, pero encontré una respuesta.
Primero, tu WordPress .htaccess
. Como @tobiv señaló en un comentario, no debe agregar nada entre los comentarios de BEGIN/END WordPress
, ya que podría ser golpeado por una actualización de WP. Sin embargo, su redireccionamiento debe venir antes de las reglas estándar de WP, así que agréguelo en la parte superior del archivo:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^hotel/ci/register /ci/register [L]
</IfModule>
# BEGIN WordPress
# ... These are the default, unchnaged WP rules
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index/.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
<IfModule mod_rewrite.c>
y RewriteEngine On
están duplicados, lo que parece desordenado, pero los necesita, ya que su nueva regla debe ir primero para que procese la solicitud antes de que lo hagan las reglas de WP.
No es necesario modificar el archivo .htaccess
Codeigniter, el predeterminado es todo lo que necesita. Debería estar en la raíz de su instalación de Codeigniter, ci/.htaccess
:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
En este punto, https://example.com/hotel/ci/register
mostrará la página Codeigniter 404. Si tiene el registro habilitado (consulte config/config.php
), y observa el archivo de registro, verá por qué:
ERROR - 2017-11-14 17:57:20 --> 404 Page Not Found: Hotel/ci
Y aquí está la raíz de todo el problema. Dado que el redireccionamiento inicial es un redireccionamiento interno (significa que la URL que se muestra en el navegador no cambia), el Codeigniter URI que se recibe para procesar es el que aún se muestra en la barra de direcciones del navegador: hotel/ci/register
. Codeigniter intentará manejar una solicitud como esa de dos maneras:
Busque una ruta que coincida en
application/config/routes.php
O busque un controlador llamado
application/controllers/Hotel.php
, con un método llamadoci
;
En nuestro caso, no hay un controlador de Hotel
ni una ruta para describir cómo manejar dicha solicitud, por lo tanto, boom, 404.
Una solución simple es crear una ruta para manejar esta solicitud:
$route[''hotel/ci/register''] = ''register/index'';
¡Y ahora https://example.com/hotel/ci/register
funciona!
Notas:
Configurar su ruta predeterminada para
register
($route[''default_controller''] = ''register'';
) significa quehttps://example.com/ci/
también mostrará el registro. No estoy seguro si quieres eso? Es posible que tenga problemas de SEO de contenido duplicado si la URL muestra lo mismo quehttps://example.com/hotel/ci/register
, así que tal vez quiera algo más, o un 404, allí.Asegúrese de eliminar su
$route[''404_override''] = ''register'';
ruta;CI
base_url
no es relevante para este problema, aunque obviamente debe configurarse. Dependiendo de cómo quiera que sean sus enlaces, creo quehttp://example.com/ci/
ohttp://example.com/hotel/ci/
serían correctos.No estoy muy seguro de cuál es el propósito de esta condición en su IC
.htaccess
para:RewriteCond $1 !^(index/.php|resources|robots/.txt)
Las condiciones predeterminadas existentes ya omiten los archivos y directorios que existen en el disco. Eso es lo que significan las condiciones
!-f
y!-d
: "si el patrón solicitado no coincide con un archivo o directorio en el disco, haga la redirección".Si tiene un archivo
robots.txt
en el disco (en suci/
dir), y alguien solicitahttps://example.com/ci/robots.txt
, la condición!-f
fallará y se omitirá la reescritura, es decir, la solicitud se maneja sin reescrituras y elrobots.txt
se devuelve correctamente. Lo mismo paraindex.php
. Si tiene un directorio llamadoci/resources
, y alguien solicitahttps://example.com/ci/resources
, la condición!-d
fallará, se omite la redirección y la solicitud se realiza correctamente.No estoy seguro de su parte de
resources
, pero quizás pueda eliminar esa condición por completo.Si no necesita URL bonitas de Codeigniter (me refiero a
https://example.com/hotel/ci/register
, este cambio no lo afectará), y resulta que no necesita esa condición adicional arriba , puedes deshacerte completamente del.htaccess
para simplificar las cosas. Para hacer eso, simplemente cambie laRewriteRule
deRewriteRule
Wordpress a la versión no bonita:RewriteRule ^hotel/ci/register /ci/index.php/register [L]
Y borra tus IC
.htacces
.
Utilice htaccess [P]
flag en su lugar.
Asegúrese de que la cadena de sustitución (destino) comience con http://
. De lo contrario, tratará la cadena de sustitución como una ruta de archivo interna.
Compruebe el código de abajo.
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^/?hotel/ci/(.*)?$ http://example.com/ci/$1 [P]
# If you want rewrite any URI as long it has */ci/* in it.
# Use the following rule instead.
# RewriteRule ^(.*)/ci/(.*)?$ http://example.com/ci/$1 [P]
RewriteRule ^index/.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
Además, no es necesario actualizar la URL base de CI. Cadena vacía hará.
$config[''base_url''] = '''';
Espero que ayude.
Campo de golf:
https://httpd.apache.org/docs/current/rewrite/flags.html#flag_p