Во что преобразуется RewriteRule в .htaccess в файле app.yaml?

Как преобразовать этот файл .htaccess в файл app.yaml?

Вот файл .htaccess:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(?!.*?public).* index.php [QSA,L]

Мне нужно сделать это, чтобы запустить приложение с использованием PHP в Google App Engine.

Причина, по которой я задаю этот вопрос, заключается в том, что Google специально рекомендует пример кода в своей официальной документации, который хранится в Git Hub под названием Dr Edit. В примере кода Dr Edit есть файл .htaccess, но нет файла app.yaml. А в файле READ ME самый первый шаг по настройке приложения — это создание приложения Google App Engine. Поэтому я предполагаю, что Google предоставил пример кода, который намекает, что он будет работать в Google App Engine, но это не так.

Предположительно Google отслеживает переполнение стека на предмет проблем, связанных с GAE, поэтому я надеюсь, что они это прочитают.


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


Ответы (3)


Вот информация о том, как имитировать маршрутизацию Apache mod_rewrite $_GET['q'] для приложения PHP App Engine, если это будет полезно.

person Amy U.    schedule 25.01.2014

Как следует из названия .htaccess, он может управлять доступом к каталогу. Файлы .htaccess считываются при каждом запросе. Я предполагаю, что это означает, что каждый HTTP-запрос к доменному имени должен проходить через файл .htaccess. Так что похоже, что файл .htaccess похож на файл gatekeeper. Из Википедии кажется, что файл .htaccess можно использовать для блокировки загрузки веб-страницы с определенного IP-адреса.

Первая строка файла .htaccess: RewriteEngine On

Эта строка кода: RewriteEngine — это директива Apache, которая включает или выключает Apache Rewriting Engine.

Так что файл .htaccess просматривает каждый запрос, принимает запрос, а затем отправляет другой запрос.

Кажется, что файл app.yaml не может напрямую принимать один запрос URL и выталкивать другой запрос, НО файл app.yaml может принимать запрос URL, а затем запускать PHP-скрипт, который изменит запрос.

Итак, в файле app.yaml раздел, который принимает URL-адрес, а затем перенаправляет на скрипт, будет выглядеть так:

Перехватите входящие запросы URL и запустите файл mod_rewrite.php.

- url: /Put the incoming URL you want to monitor, catch and redirect here
  script: mod_rewrite.php

Перенаправлять URL-запросы с помощью app.yaml

Вторая строка файла .htaccess:

RewriteCond %{REQUEST_FILENAME} !-f

Это тест, ищущий совпадения во входящем запросе URL. -f в конце означает:

-f (обычный файл) Рассматривает TestString как путь и проверяет, существует ли он или нет, и является ли он обычным файлом.

О, подождите! Перед ним стоит восклицательный знак. Это, наверное, тест на логическое нет. Итак, если это НЕ обычный файл?

Что бы это ни значило. Чем отличается обычный файл от всего остального? Что такое нестандартный файл? лол, идк. В любом случае, он ищет файл, я думаю.

Вот цитата из документации Apache:

Серверные переменные: это переменные вида %{ NAME_OF_VARIABLE }, где NAME_OF_VARIABLE может быть строкой, взятой из следующего списка:

Так что часть %{REQUEST_FILENAME} второй строки — это то, что Apache называет Server-Variable, а конкретное Server-Variable — это REQUEST_FILENAME.

Вот цитата из документации Apache:

REQUEST_FILENAME Полный путь локальной файловой системы к файлу или сценарию, соответствующему запросу, если он уже был определен сервером во время обращения к REQUEST_FILENAME. В противном случае, например, при использовании в контексте виртуального хоста, то же значение, что и REQUEST_URI. В зависимости от значения AcceptPathInfo сервер мог использовать только некоторые ведущие компоненты REQUEST_URI для сопоставления запроса с файлом.

Итак, я предполагаю, что файл .htaccess ищет что-то похожее на путь к файлам на вашем локальном компьютере?

Наконец, есть Rewrite Rule правило перезаписи Apache.

Для чего QSA в конце? Я предполагаю, что это называется флагом, и:

Использование флага [QSA] приводит к объединению строк запроса

QSA, кажется, означает Query String Append. Если в конце входящего URL-адреса есть строка запроса, как вы хотите ее обработать?

[L] предотвращает добавление любых дальнейших правил перезаписи.

Флаг перезаписи Appache L QSA документации Appache

Символ (^) называется кареткой. Я не знаю, почему это используется в начале. Синтаксис директивы Appache Rewrite:

RewriteRule pattern target [Flag1,Flag2,Flag3]

Таким образом, курсор является частью обнаруживаемого шаблона. Эта цель просто index.php. Таким образом, похоже, что множество различных возможных запросов просто направляются обратно в файл index.php, который является самым первым, что запускает приложение.

Звездочка в конце, вероятно, является подстановочным знаком для любого расширения.

person Alan Wells    schedule 25.01.2014
comment
Помог ли этот ответ? Я думал, что .htaccess — это просто файл данных, поэтому он ничего не может сделать, а веб-сервер Apache, который выполняет действия, указанные в .htaccess, не работает на AppEngine. Действительно ли веб-сервер Apache запускает ваше PHP-приложение? Единственные два упоминания Apache в среде выполнения PHP не подтверждают, что это так. . Ранее упомянутый симулятор PHP mod_rewrite не использует .htaccess. Из любопытства, как вы решили свою проблему? - person Martin Berends; 14.03.2014
comment
Я отказался от попыток запустить пример Dr Edit. Я все еще использую GAE, и я придерживался использования PHP, но что касается этой конкретной проблемы, это был просто еще один тупиковый путь в никуда, и битва, которую я не мог выиграть, я думаю. Хорошая вещь в том, что я слишком глуп, чтобы найти решение проблемы, заключается в том, что это заставляет меня искать более легкий и простой способ сделать это. ржу не могу - person Alan Wells; 14.03.2014
comment
:-) Я также считаю, что попытки решить проблемы — это хороший способ учиться, даже если исходная проблема не решена. Некоторые называют это бритьем яков в качестве примера. - person Martin Berends; 14.03.2014

Я думаю, вам не повезло :-( Rewrite — это модуль Apache, но AppEngine основан на Jetty, поэтому для этого вам необходимо изменить дизайн. Возможно, вы сможете использовать один из Сервлеты, фильтры и обработчики в комплекте, но ни один из них не является прямой заменой Модуль Apache mod_rewrite. Некоторые люди использовали Apache в качестве внешнего интерфейса до Jetty, но это неуклюжий подход. Извините.

person Martin Berends    schedule 20.01.2014
comment
Похоже, есть способ перенаправить URL. - person Alan Wells; 26.01.2014
comment
Это отличный обходной путь PHP. Я надеюсь, что это работает для вас. - person Martin Berends; 26.01.2014