какую ссылку они добавляют, чтобы сохранить ссылку и перенаправить на index.php [duplicate]

Просто await три задачи отдельно, после их запуска.

var catTask = FeedCat();
var houseTask = SellHouse();
var carTask = BuyCar();

var cat = await catTask;
var house = await houseTask;
var car = await carTask;
85
задан David Ericsson 23 August 2013 в 16:06
поделиться

5 ответов

Правило вашего переписывания выглядит почти нормально.

Сначала убедитесь, что ваш файл .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.

161
ответ дан CD001 19 August 2018 в 07:42
поделиться
  • 1
    он должен быть index.php? path = $ 1 – Prozi 4 February 2015 в 00:11
  • 2
    @Prozi нет, если вы находитесь в подкаталоге, а index.php находится в docroot, тогда вам нужен ведущий / - с Options +Indexes и index.php включенный в DirectoryIndex, вы могли полностью исключить index.php и просто использовать /?path=$1. Это верно, когда выполняется переписывание через .htaccess, а не в httpd-vhosts. conf <Directory>. – CD001 5 February 2015 в 14:40
  • 3
    Если вы используете это и полагаетесь на $ _GET ['path'], у вас будут проблемы при переходе на nginx-сервер ... – barell 20 June 2016 в 14:33
  • 4
    @barell. Я не очень хорошо знаком с вставками nginx - но, полагаю, вы имеете в виду это? [Д0] serverfault.com/questions/231578/… – CD001 20 June 2016 в 14:53
  • 5
    Хороший пост! Стоит отметить, что пользователь может перезаписать $_GET['path'], если они добавят path=whatever в URL. – rybo111 26 September 2016 в 15:13

Глупый ответ, но если вы не можете понять, почему его не перенаправлять, проверьте, что для веб-папки включено следующее.

AllowOverride All

Это позволит вам для запуска htaccess, который должен быть запущен! (есть альтернативы, но не на вызове проблемы https://httpd.apache.org/docs/2.4/mod/core.html#allowoverride )

3
ответ дан Antony 19 August 2018 в 07:42
поделиться

Существует одна «трюка» для этой проблемы , которая подходит ко всем сценариям, настолько очевидное решение, что вам придется попытаться поверить, что это действительно работает ...:)

Здесь это ...

<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% во всех случаях!

4
ответ дан Julio Marchi 19 August 2018 в 07:42
поделиться

Чтобы перенаправить все, что не существует в 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, мы исключили путь назначения, чтобы предотвратить ошибку бесконечного цикла.

18
ответ дан starkeen 19 August 2018 в 07:42
поделиться

Вы можете использовать что-то вроде этого:

RewriteEngine on
RewriteRule ^.+$ /index.php [L]

Это перенаправит каждый запрос в index.php корневого каталога. Обратите внимание, что он также перенаправляет запросы на существующие файлы, такие как изображения, файлы javascript или таблицы стилей.

12
ответ дан Technoh 19 August 2018 в 07:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: