url переписать с необязательными параметрами [duplicate]

Это означает, что ваш код использовал ссылочную переменную объекта, которая была установлена ​​в нуль (т. е. она не ссылалась на экземпляр фактического объекта).

Чтобы предотвратить ошибку, объекты, которые могут быть пустыми, должны быть протестированы для null перед тем, как использовать.

if (myvar != null)
{
    // Go ahead and use myvar
    myvar.property = ...
}
else
{
    // Whoops! myvar is null and cannot be used without first
    // assigning it to an instance reference
    // Attempting to use myvar here will result in NullReferenceException
}
2
задан Lasse Vågsæther Karlsen 3 November 2011 в 17:48
поделиться

2 ответа

Прежде всего: вы не должны использовать .*, если можете быть более конкретным, как в этом случае [^/]+. Потому что несколько .* могут вызвать огромный откат. Итак:

RewriteRule ^viewshoplatest/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/$ /viewshoplatest.php?$1=$2&$3=$4&$5=$6&$7=$8&$9=$10&$11=$12&$13=$14&$15=$16

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

Но поскольку mod_rewrite делает только позволяют ссылаться на первые девять групп (см. ответ Тима ), вы можете использовать итеративный подход и обрабатывать по одному параметру за раз:

RewriteRule ^viewshoplatest/([^/]+)/([^/]+)/([^/]+/[^/]+/.*)$ /viewshoplatest/$3?$1=$2 [QSA,N]
RewriteRule ^viewshoplatest/([^/]+)/([^/]+)/([^/]*)/?$ /viewshoplatest.php?$1=$2&$3 [QSA,L]

Первое правило будет обрабатывать один Параметр пара за раз (кроме последней пары), добавив его к уже существующим (см. флаг QSA ), а затем перезапустите процесс перезаписи без увеличения внутреннего счетчика рекурсии (см. N ). Второе правило затем перепишет последнюю пару пара (или просто имя) и закончит итерацию.

Но поскольку использование флага N может быть опасным, поскольку это может привести к бесконечному recursion, вы также можете использовать PHP для анализа запрошенного пути:

$_SERVER['REQUEST_URI_PATH'] = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$segments = implode('/', trim($_SERVER['REQUEST_URI_PATH'], '/'));
array_shift($segments); // remove path prefix "/viewshoplatest"
for ($i=0, $n=count($segments); $i<$n; ) {
    $_GET[rawurldecode($segments[$i++])] = ($i < $n) ? rawurldecode($segments[$i++]) : null;
}

Теперь вам просто нужно это правило, чтобы передать запрос через:

RewriteRule ^viewshoplatest(/|$) /viewshoplatest.php [L]
5
ответ дан Community 27 August 2018 в 00:36
поделиться

Просто чтобы узнать, что вы узнали, вы можете определить только девять групп, которые будут использоваться в качестве обратных ссылок, поэтому обычно лучше переписать сценарий sans-query и проверить скрипт REQUEST_URI в случаи, когда у вас будет много данных для разбора.

Из документация :

Back-ссылки - это идентификаторы формы $ N (N = 0..9), который будет заменен содержимым N-й группы сопоставленного шаблона

$0 - это весь сопоставленный шаблон, дающий вам оставшиеся девять номера для работы. Любое большее число рассматривается как обратная ссылка, за которой следуют некоторые буквальные числовые символы.

3
ответ дан Tim Stone 27 August 2018 в 00:36
поделиться
Другие вопросы по тегам:

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