
Estou tentando organizar um bloco de localização para qualquer pessoa passar pelo mydomain.com/game/admin
URL, certifique-se de que o servidor nginx para extrair o conteúdo exista no /var/www/html/my-cakephp-app/
diretório. Meu aplicativo foi construído usando o framework cakephp e sua estrutura de diretórios é mostrada abaixo:
- /var/www/html/my-cakephp-app/
- administrador
- Configuração
- Console
- Controlador
- Visualizar
- webroot (o arquivo index.php do ponto de entrada do aplicativo existe neste diretório)
Também tenho um site html/css estático localizado no /var/www/html
diretório. Assim, qualquer pessoa com mydomain.com
URL também pode ver esse site.
Aqui está meu bloco de servidor nginx atual:
server {
listen 80;
listen [::]:80;
root /var/www/html;
index index.html index.htm index.php;
server_name mydomain.com;
location / {
try_files $uri $uri/ =404;
}
location /game/admin {
return 301 /game/admin/;
}
location /game/admin/ {
root /var/www/html/my-cakephp-app/admin/webroot;
try_files $uri $uri/ /game/admin/index.php$is_args$args;
location ~* \.php(/|$) {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
Com esta configuração, meu site estático está funcionando bem. Mas o aplicativo cakephp dá erro 404 não encontrado no navegador. Não há erros no nginx/error.log.
Mas quando executo com a configuração nginx abaixo, meu aplicativo funciona bem. Mas preciso me livrar do meu site html/css. Estou planejando atualizar o aplicativo html/css com um site wordpress. Portanto, eu deveria ter a capacidade de executar o site wordpress como pai.
server {
listen 80;
server_name mydomain.com;
root /var/www/html/my-cakephp-app/admin/webroot;
index index.html index.htm index.php;
location / {
try_files $uri $uri/ /index.php$is_args$args;
autoindex on;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
Não consegui pensar no que fiz de errado com o primeiro bloco de servidor. Qualquer sugestão seria realmente útil.
Responder1
Os dois principais problemas são:
- o bloco externo
location ~ \.php$
tem precedência sobre olocation /game/admin/
bloco, a menos que você use o^~
modificador (consulteesse documentopara detalhes) - a
root
diretiva gera um caminho para o arquivo por concatenação simples, então espera-se que seu controlador esteja localizado em/var/www/html/my-cakephp-app/admin/webroot/game/admin/index.php
(vejaesse documentopara detalhes)
Uma opção é mover o projeto para que a estrutura de diretórios corresponda à estrutura do URI. Isto poderia ser conseguido usando um link simbólico que aponta /var/www/html/game/admin
nesse /var/www/html/my-cakephp-app/admin/webroot
caso o location ~ \.php$
bloco externo será capaz de executar ambos os projetos.
Outra opção é a alias
diretiva. Veresse documentopara detalhes.
location ^~ /game/admin {
alias /var/www/html/my-cakephp-app/admin/webroot;
if (!-e $request_filename) { rewrite ^ /game/admin/index.php last; }
location ~ \.php$ {
if (!-f $request_filename) { return 404; }
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $request_filename;
}
}
Observe que isso $document_root$fastcgi_script_name
não funcionará alias
e $request_filename
deve ser usado.
Evito usar alias
e try_files
juntos devido aesse assunto. Veresse cuidadosobre a utilização da if
directiva.