Просто await
три задачи отдельно, после их запуска.
var catTask = FeedCat();
var houseTask = SellHouse();
var carTask = BuyCar();
var cat = await catTask;
var house = await houseTask;
var car = await carTask;
Правило вашего переписывания выглядит почти нормально.
Сначала убедитесь, что ваш файл .htaccess
находится в вашем корневом каталоге документа (то же самое место, что и index.php
), или это повлияет только на подпапку он находится в (и любых подпапках внутри этого - рекурсивно).
Далее сделайте небольшое изменение для вашего правила, чтобы оно выглядело примерно так:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?path=$1 [NC,L,QSA]
re только сопоставление на .
, которое является одним экземпляром любого символа, вам нужно как минимум .*
соответствовать любому количеству экземпляров любого символа.
Переменная $_GET['path']
будет содержать фальшивую структуру каталогов , поэтому /mvc/module/test
, например, вы можете использовать в index.php для определения Controller и действий, которые вы хотите выполнить.
Если вы хотите, чтобы весь shebang был установлен в подкаталог, например /mvc/
или /framework/
, наименее сложный способ сделать это - слегка изменить правило перезаписи, чтобы учесть это.
RewriteRule ^(.*)$ /mvc/index.php?path=$1 [NC,L,QSA]
И убедитесь, что ваш index.php
находится в этой папке, в то время как файл .htaccess
находится в корне документа.
Альтернатива $_GET['path']
(обновлено февраль18)
На самом деле нет необходимости (и даже не сейчас) установить путь в качестве переменной $_GET
, многие фреймворки будут полагаться на $_SERVER['REQUEST_URI']
для получения той же информации - обычно для определения того, какой контроллер использовать, - но принцип точно такой же.
Это упрощает RewriteRule
, так как вы не знаете, t необходимо создать параметр path :
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /index.php [L,QSA]
Те же правила об установке в подкаталоге все еще применяются, например
RewriteRule ^.*$ /mvc/index.php [L,QSA]
Флаги:
NC
= Нет Случай (не чувствителен к регистру, не нужен, так как в шаблоне нет символов)
L
= Last (он перестанет переписывать после этого Rewrite, поэтому убедитесь, что это последнее, что есть в вашем списке переписывающих)
QSA
= Query String Apend, на всякий случай у вас есть что-то как ?like=penguins
на конце, который вы хотите сохранить и передать index.php.
Глупый ответ, но если вы не можете понять, почему его не перенаправлять, проверьте, что для веб-папки включено следующее.
AllowOverride All
Это позволит вам для запуска htaccess, который должен быть запущен! (есть альтернативы, но не на вызове проблемы https://httpd.apache.org/docs/2.4/mod/core.html#allowoverride )
Существует одна «трюка» для этой проблемы , которая подходит ко всем сценариям, настолько очевидное решение, что вам придется попытаться поверить, что это действительно работает ...:)
Здесь это ...
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [L,QSA]
</IfModule>
В принципе, вы запрашиваете MOD_REWRITE для пересылки index.php
запроса URI всегда, когда файл существует, и всегда, когда запрошенный файл не существует!
Изучая исходный код MOD-REWRITE, чтобы понять, как он работает, я понял, что все его проверки всегда происходят после проверки, существует ли файл ссылки. Только тогда обрабатываются RegEx
. Даже когда ваш URI указывает на папку, Apache будет принудительно проверять наличие индексных файлов , перечисленных в его файле конфигурации.
Основываясь на этом простом открытии, стало очевидной простая проверка файла будет достаточно для всех возможных вызовов, поскольку мы дважды используем проверку наличия файла и маршрутизируем оба результата в одну и ту же конечную точку, покрывая 100% возможностей.
ВАЖНО: Обратите внимание, что нет "/" в index.php
. По умолчанию MOD_REWRITE будет использовать папку, для которой он настроен как «базовая папка» для пересылки. Красота заключается в том, что необязательно быть «корневой папкой» сайта, позволяя этому решению работать для localhost/
и / или любой вложенной папки, к которой вы его применяете.
В конечном итоге некоторые другие решения, которые я тестировал раньше (те, которые, казалось, работали нормально), нарушили способность PHP «требовать» файл через его относительный путь, который является обломком. Будьте осторожны.
Некоторые люди могут сказать, что это неэлегантное решение. Это может быть, на самом деле, но, что касается тестов, в нескольких сценариях, нескольких серверах, нескольких разных версиях Apache и т. Д., Это решение работало на 100% во всех случаях!
Чтобы перенаправить все, что не существует в index.php
, вы также можете использовать директиву FallBackResource
FallbackResource /index.php
. Он работает так же, как и ErrorDocument
, когда вы запрашиваете несуществующий путь или файл на сервере, директива молча заставляет запрос index.php
.
Если вы хотите перенаправить все (including existant files or folders
) на index.php
, вы можете использовать что-то вроде следующего:
RewriteEngine on
RewriteRule ^((?!index\.php).+)$ /index.php [L]
Обратите внимание, что шаблон ^((?!index\.php).+)$
соответствует любому uri, кроме index.php
, мы исключили путь назначения, чтобы предотвратить ошибку бесконечного цикла.
Вы можете использовать что-то вроде этого:
RewriteEngine on
RewriteRule ^.+$ /index.php [L]
Это перенаправит каждый запрос в index.php корневого каталога. Обратите внимание, что он также перенаправляет запросы на существующие файлы, такие как изображения, файлы javascript или таблицы стилей.
Options +Indexes
и index.php i> включенный вDirectoryIndex
, вы могли i> полностью исключить index.php i> и просто использовать/?path=$1
. Это верно, когда выполняется переписывание через .htaccess, а не в httpd-vhosts. conf<Directory>
. – CD001 5 February 2015 в 14:40$_GET['path']
, если они добавятpath=whatever
в URL. – rybo111 26 September 2016 в 15:13