Tengo un sitio en el que quiero crear y eliminar carpetas con sitios provisionales de WordPress.
la estructura es algo como esto:
/wp1
/wp2
/wp3
/...
Estoy usando nginx y soy consciente de que para que esto funcione tengo que crear múltiples bloques de ubicación para capturar cada sitio de WordPress:
location /wp1 {
try_files $uri $uri/ /wp1/index.php?$args;
}
location /wp2 {
try_files $uri $uri/ /wp2/index.php?$args;
}
location /wp3 {
try_files $uri $uri/ /wp3/index.php?$args;
}
...
Esa configuración funciona perfectamente, pero es difícil de mantener, así que estaba probando una expresión regular con la ubicación para usar solo un bloque de ubicación para todos los sitios, así puedo eliminar y crear carpetas sin tener que preocuparme con la configuración de nginx:
location ~ ^/wp(?<staging>\d+) {
try_files $uri $uri/ /wp$staging/index.php?$args;
}
Pero esto no funciona. ¿Alguna idea sobre lo que me estoy perdiendo?
Este es mi archivo de configuración completo:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /home/city/sites/staging1/html;
index index.php;
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ ^/stg(?<staging>\d+) {
try_files $uri $uri/ /stg$staging/index.php?$args;
}
location ~ \.php$ {
include fastcgi.conf;
fastcgi_intercept_errors on;
fastcgi_pass unix:/run/php/php7.0-fpm.city.sock;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
}
Esta es la salida decurl -I http://ipaddress/wp2
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Tue, 17 Jan 2017 03:45:43 GMT
Content-Type: text/html
Content-Length: 178
Location: http://ipaddress/wp2/
Connection: keep-alive
Esta es la salida decurl -I http://ipaddress/wp2/
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 17 Jan 2017 03:45:49 GMT
Content-Type: application/octet-stream
Content-Length: 418
Last-Modified: Wed, 25 Sep 2013 00:18:11 GMT
Connection: keep-alive
ETag: "52422bc3-1a2"
Accept-Ranges: bytes
Pero esto descarga el archivo index.php de WordPress, el tipo de contenido es application/octet-stream
el que no es el que debería obtener.
Esta es una salida curl esperada sin el bloque de ubicación de expresiones regulares, un sitio simple de WordPress:
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 17 Jan 2017 04:30:30 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Link: <http://ipaddress/wp2/wp-json/>; rel="https://api.w.org/"
Link: <http://ipaddress/wp2/>; rel=shortlink
En los archivos de registro de nginx puedo ver que se está utilizando la ubicación de la expresión regular, pero no entiendo cuál es el problema y por qué recibo esa respuesta:
[debug] 24359#24359: *1330 test location: "/"
[debug] 24359#24359: *1330 test location: "favicon.ico"
[debug] 24359#24359: *1330 test location: "robots.txt"
[debug] 24359#24359: *1330 test location: ~ "^/wp(?<staging>\d+)"
[debug] 24359#24359: *1330 http regex set $staging to "2"
[debug] 24359#24359: *1330 using configuration "^/wp(?<staging>\d+)"
[debug] 24359#24359: *1330 http cl:-1 max:1048576
[debug] 24359#24359: *1330 rewrite phase: 3
[debug] 24359#24359: *1330 post rewrite phase: 4
[debug] 24359#24359: *1330 generic phase: 5
[debug] 24359#24359: *1330 generic phase: 6
[debug] 24359#24359: *1330 generic phase: 7
[debug] 24359#24359: *1330 access phase: 8
[debug] 24359#24359: *1330 access phase: 9
[debug] 24359#24359: *1330 access phase: 10
[debug] 24359#24359: *1330 post access phase: 11
[debug] 24359#24359: *1330 try files phase: 12
[debug] 24359#24359: *1330 http script var: "/wp2"
[debug] 24359#24359: *1330 trying to use file: "/wp2" "/home/city/sites/staging1/html/wp2"
[debug] 24359#24359: *1330 http script var: "/wp2"
[debug] 24359#24359: *1330 trying to use dir: "/wp2" "/home/city/sites/staging1/html/wp2"
[debug] 24359#24359: *1330 try file uri: "/wp2"
[debug] 24359#24359: *1330 content phase: 13
[debug] 24359#24359: *1330 content phase: 14
[debug] 24359#24359: *1330 content phase: 15
[debug] 24359#24359: *1330 content phase: 16
[debug] 24359#24359: *1330 content phase: 17
[debug] 24359#24359: *1330 http filename: "/home/city/sites/staging1/html/wp2"
Respuesta1
El problema parece ser que tu PHP no se está ejecutando, solo se está descargando.
Según su comentario, debe describir la solución, ya sea en su propia respuesta, en un comentario sobre esta respuesta o editando su pregunta. Creo que las cosas están un poco limitadas para los usuarios con números de reputación más bajos.
Respuesta2
El problema era que la ubicación de la expresión regular no utilizaba:
location ~ \.php$ {
include fastcgi.conf;
fastcgi_intercept_errors on;
fastcgi_pass unix:/run/php/php7.0-fpm.city.sock;
}
entonces lo que estaba pasando era que el archivo php no se estaba ejecutando.
Para resolver el problema, simplemente agregué una location ~ \.php$
dentro de la ubicación de la expresión regular problemática:
location ~ ^/stg_(?<staging>\w+) {
try_files $uri $uri/ /stg_$staging/index.php?$args;
location ~ \.php$ {
include fastcgi.conf;
fastcgi_intercept_errors on;
fastcgi_pass unix:/run/php/php7.0-fpm.city.sock;
}
}