Приложение Google App Engine app.yaml соответствует всем файлам PHP и соответствует всем файлам HTML и служит соответственно.

Я использую Google App Engine с PHP. Я хочу, чтобы все файлы HTML в папке Client_Pages распознавались и использовались как статические файлы, а все файлы PHP в той же папке распознавались и использовались как файлы сценариев. Вот как выглядит файл app.yaml:

application: myappname
version: 1
runtime: php
api_version: 1
threadsafe: true

handlers:
- url: /
  script: index.php

- url: /Client_Pages/*.php
  script: /Client_Pages/*.php

- url: /Client_Pages/*.html
  static_dir: Client_Pages/*.html

Я предполагаю, что asterisk не работает как подстановочный знак в app.yaml? Я пробовал использовать:

- url: /(.+\.php)
  script: Client_Pages/\1

Но это не работает. Я даже не знаю, что означают все символы, так что я просто ковыряюсь в надежде, что что-то сработает. Я не хочу этого делать, но не могу найти документацию о том, что делают все эти символы.

Это будет работать для конкретной страницы:

- url: /Client_Pages/InputForm.php
  script: /Client_Pages/InputForm.php

Я мог бы поместить строку в файл app.yaml для каждой отдельной страницы моего веб-сайта, но я бы предпочел найти другой способ.

О, подождите! Подожди! Это работает для загрузки моих файлов PHP:

- url: /(.+\.php)
  script: \1

Так что же означает \1? Или где хорошая ссылка?

Итак, вышеприведенное работает для php страниц, но это НЕ работает для HTML-страниц. Почему?

- url: /(.+\.html)
  static_dir: \1

У меня есть кое-что для работы. Это загрузит мои страницы PHP и HTML:

- url: /(.+\.php)
  script: \1

- url: /Client_Pages
  static_dir: Client_Pages

Итак, я нашел решение, но я до сих пор совершенно не понимаю, почему оно работает или что означают символы.

Я прошу прощения за то, что нашел частичный ответ на свой вопрос в процессе его публикации, но если кто-то может объяснить, почему это работает, я дам вам заслуженные баллы.


person Alan Wells    schedule 04.03.2014    source источник


Ответы (1)


Справочник по регулярным выражениям python, вероятно, проще всего понять и наиболее близок к тому, что происходит здесь, вместе со ссылкой на app.yaml.

По сути, ( ) в регулярном выражении указывает группировку (также известную как обратная ссылка), и ваше регулярное выражение может иметь много групп. \1 — это ссылка на первую группу, \2 — на вторую группу и т. д. Это позволяет извлечь значение, соответствующее регулярному выражению, и использовать это значение для выбора скрипта или статического ресурса.

Итак, в основном для регулярного выражения

/(.+\.php) 

говорит: «сделайте первой группе любое значение, соответствующее регулярному выражению .+\.php». Значение, соответствующее регулярному выражению, можно получить, используя \1, указывающую первую группу.

Таким образом, значение /foobar.php соответствует регулярному выражению .+.php, а значение \1 становится foobar.php из-за ( ) вокруг регулярного выражения.

Чуть сложнее:

/(.+)/(.+)\.php$

Значение /foo/bar.php будет соответствовать этому регулярному выражению, \1 будет равно 'foo' [поскольку это первая группа в регулярном выражении], а \2 будет равно 'bar' [поскольку это вторая группа].

Обратите внимание, что это регулярное выражение не соответствует /foobar.php.

Вы также можете сделать что-то подобное, чтобы URL-адрес не должен был содержать .php.

- url: /(.+)
  script: \1.php

Используя static_dir, вы устраняете необходимость группировки, поскольку она будет соответствовать любому файлу, находящемуся в каталоге.

Если вы хотите сопоставить только файлы *.html, вы можете использовать

- url: /Client_Pages/(.*)\.html$
  static_files: Client_Pages/\1.html
  upload: Client_Pages/*\.html$

Наконец, что нужно помнить с app.yaml, так как он обрабатывает правила сверху вниз, и выполняется первое совпадение, и обработка останавливается.

Итак, app.yaml вроде

- url: /.*
  script: index.php

- url: /(.+)\.html
  static_dir: html_pages

будет всегда выполнять index.php, так как первое регулярное выражение будет соответствовать любому входящему URL.

person Stuart Langley    schedule 05.03.2014
comment
Я попытался использовать static_files: с upload: и только с html файлами, и он перестал обслуживать некоторые css файлы, которые у меня были в подкаталоге. Итак, я думаю, я просто буду продолжать использовать static_dir для распознавания всех файлов html и css и их обслуживания. php файлы не будут реагировать ни на что, кроме обработчика script:. - person Alan Wells; 07.03.2014
comment
просто добавьте css в регулярное выражение, затем (css|html)$ и т. д. Взгляните на wordpress app.yaml -> developers.google.com/appengine/articles/wordpress - person Stuart Langley; 07.03.2014
comment
Спасибо, я видел это: - url: /(.*\.(htm|html|css|js))$ Есть ли преимущество в такой настройке? Я в недоумении для понимания цели конфигурации. Если в конфигурации все равно все совпадает, то какой в ​​этом смысл? - person Alan Wells; 07.03.2014
comment
он соответствует только файлам, которые заканчиваются этими расширениями, а не «всем». - person Stuart Langley; 07.03.2014
comment
Да, верно. Мне просто любопытно рассмотреть преимущества/недостатки между: - url: /(.*\.(htm|html|css|js))$ и - url: /Client_Pages static_dir: Client_Pages. - person Alan Wells; 07.03.2014
comment
один обслуживает все, другой дает вам больше контроля - скажем, например, у вас есть файлы jpg в той же папке, которую вы хотите обслуживать с разными заголовками кеша и т. д. - person Stuart Langley; 07.03.2014