#php #regex #.htaccess
Вопрос:
Вот что я имею в виду, используя пример, у меня есть два типа ссылок, таких как-
http://example.com/type.php?category=movies
http://example.com/type.php?tags=movies
И я использовал такой код в htaccess
RewriteRule ^type/([0-9a-zA-Z_-] ) type.php?category=$1 [NC,L]
RewriteRule ^type/([0-9a-zA-Z_-] ) type.php?tags=$1 [NC,L]
Но все равно не повезло, первый код, который находится в первой строке другого, как в этом случае, работает только категория?, а теги ?не работают. каков может быть возможный правильный ответ для решения обоих?
Заранее спасибо!
Комментарии:
1. Вам нужно придумать что-то уникальное в каждом маршруте, прямо сейчас ваш второй маршрут является дубликатом первого и никогда не сработает. Вы можете сделать что-то вроде
/type/category/movies
2. почему вы вообще хотите все перепутать? Разве ты не можешь сделать все просто и чисто? :/
3. Другими словами, исходя из ваших директив (предложенной структуры URL), что бы вы хотели, чтобы произошло, когда поступит запрос
/type/movies
?
Ответ №1:
Попробуйте удалить букву L из [NC,L], потому что это означает, что если .htaccess может применить это правило, вы скажете ему прекратить переписывание здесь, и поэтому он не будет выполнять вторую строку.
Вот еще о флагах : https://httpd.apache.org/docs/2.4/en/rewrite/flags.html
«Флаг [L] приводит к тому, что mod_rewrite прекращает обработку набора правил. В большинстве случаев это означает, что, если правило совпадает, никакие дальнейшие правила обрабатываться не будут».
=-=
Кроме того, как прокомментировал Крис Хаас, если вы недостаточно конкретны в своих правилах и исходный URL-адрес из первого правила находится во всех других правилах, то он всегда будет обрабатывать только первое правило.
Хорошим примером этого является :
RewriteRule ^([a-z0-9_] )/([a-z0-9_] )/([a-z0-9_] )$ index.php?param1=$1
RewriteRule ^([a-z0-9_] )/([a-z0-9_] )/([a-z0-9_] )$ index.php?param1=$1amp;param2=$2
RewriteRule ^([a-z0-9_] )/([a-z0-9_] )/([a-z0-9_] )$ index.php?param1=$1amp;param2=$2amp;param3=$3
Поскольку первое правило можно найти в других правилах (здесь и 2-е, и 3-е, то эти 2-е и 3-е будут рассматриваться как «такие же», как и первое, и поэтому не выполняются.
Комментарии:
1. «Попробуйте удалить
L
» — Нет! Вы хотите, чтобы для чего-то подобного применялось только одно правило. Здесь нет смысла сниматьL
флаг. Однако удалениеL
флага в любом случае не будет иметь никакого эффекта, потому что результат соответствующего правила используется в качестве входных данных для следующего — так что он все равно не будет совпадать (и вы не хотите, чтобы он совпадал). «Хорошим примером для этого является» — Возможно, лучший пример уже приведен в вопросе!2. Я только сейчас вижу, что на самом деле правила должны иметь либо категорию, либо теги в качестве первого параметра. Если категория найдена, то не читайте другие правила. Если нет, проверьте, является ли первый параметр тегами и т. Д. и т. Д. Действительно. Я не знаю, как я этого не понял. Возможно, я неправильно понял проблему.