Как правильно маршрутизировать вызовы каталога в app.yaml?

Я хочу имитировать этот .htaccess переписанный в Google App Engine app.yaml с использованием PHP:

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-s
    RewriteRule ^(.*)$ query.php?q=$1 [QSA,NC,L]
</IfModule>

Я сделал это:

runtime: php55
api_version: 1
threadsafe: true

handlers:
  # mod_rewrite by forwarding the requests to query.php?q=...
  - url: /services/(.+)
    script: services/query.php?q=\1

  # Serve images as static resources.
  - url: /(.+\.(gif|png|jpg|ico|svg))$
    static_files: \1
    upload: .+\.(gif|png|jpg|ico|svg)$
    application_readable: true

  - url: /(.+\.(html))$
    static_files: \1
    upload: .+\.(html)$
    application_readable: true

  # Serve php scripts.
  - url: /(.+\.php)$
    script: \1

  - url: /
    static_files: index.html
    upload: index.html
    application_readable: true

Но в результате всегда не найдена ошибка:

"POST /services/login HTTP/1.1" 404

Я думаю, что обработчики этого не улавливают. Любая подсказка, чтобы сделать это правильно?


person yuwono95    schedule 16.12.2018    source источник


Ответы (1)


Я не думаю, что вы можете это сделать - оператор script: предназначен не для указания полного URL-адреса (с его строкой запроса), а просто для указания пути к сценарию. Из элемента Handlers:

скрипт

Необязательный. Указывает путь к скрипту из корневого каталога приложения:

...
handlers:
- url: /profile/(.*)/(.*)
  script: /employee/\2/\1.php  # specify a script

Вы можете легко убедиться в этом, заменив script: services/query.php?q=\1 на script: services/query.php в своем первом обработчике. Если скрипт services/query.php начинает вызываться, это означает, что сопоставление с образцом сработало нормально, и проблема заключалась в спецификации скрипта — services/query.php?q=\1 не является допустимым путем к файлу скрипта.

person Dan Cornilescu    schedule 16.12.2018