Я пытаюсь переместить существующее приложение на GoogleAppEngine PHP/Flex в GoogleAppEngine PHP/Standard, чтобы воспользоваться функциями стандартного движка.
Мой проект настроен следующим образом:
- server/public_html/rest/index.php: Slim Framework, front_controller_file
- server/src : код приложения php
- server/public_html/index.html : приложение angularjs (+другие файлы в этом каталоге.
В GAE PHP Flex мой файл app.yaml выглядел следующим образом:
api_version: 1
runtime: php
env: flex
skip_files:
- ^db$
- ^vendor$
- ^Spotfire$
- ^complete-sync\.sh$
- ^phinx\.yml$
- ^phinx-template\.yml$
- ^selective-sync\.sh$
runtime_config:
document_root: /app/public_html
front_controller_file: /app/public_html/rest/index.php
enable_stackdriver_integration: true
...
И чтобы Slim Framework работал
nginx-app.conf находился в /server/nginx-app.yaml
location / {
# try to serve file directly, fallback to front controller
try_files $uri /index.html$is_args$args;
}
location /rest {
# try to serve file directly, fallback to front controller
try_files $uri /rest/index.php$is_args$args;
}
location ~ \.php {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
}
Теперь, в стандарте GAE PHP, мой app.yaml выглядит следующим образом:
runtime: php72
entrypoint: serve public_html/rest/index.php
runtime_config:
document_root: public_html
enable_stackdriver_integration: true
и мой dispatch.yaml выглядит следующим образом:
dispatch:
# Send all rest traffic to the backend
- url: "*/rest/*"
service: default
# Send the rest to the front (angularjs)
- url: "*/*"
service: front
и nginx-app.conf все тот же.
Когда я достигаю URL-адреса (example.com) приложения, приложение angularjs загружается правильно, я вижу экран входа в систему.
если я перейду на example.com/rest/index.php
Я получаю ошибку аутентификации, что является ожидаемым поведением.
Однако, если я пойду в
example.com/rest/authenticate
Я получаю 404, и я все еще должен получить ошибку приложения вместо 404. С правилом перезаписи nginx он должен преобразовать URL-адрес в это:
example.com/rest/index.php?аутентифицировать
Кроме того, в моем коде я проверяю путь, чтобы исключить какой-либо путь проверки подлинности для некоторой общедоступной страницы (и аутентификации)
Когда я нажал кнопку входа в систему, в моем гибком развертывании путь $ был «аутентифицирован», а здесь «/rest/authenticate».
$path = $request->getUri()->getPath ();
Любая идея о том, как отладить это?
Я чувствую, что мог бы использовать только одну службу (по умолчанию), но example.com/ указывает на public_html/rest/index.php, что мне не подходит, так как я хочу/быть приложением angularjs и частью REST с отдыхом/ в пути.
dispatch.yaml
, который работает выше уровня службы и определяет по имени, к какой службе должен быть направлен конкретный запрос. Язык программирования/среда служб не имеют значения в этом решении о маршрутизации. - person Dan Cornilescu   schedule 06.04.2019