Как обработать два разных параметра с одинаковым именем файла в htaccess?

#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. Я только сейчас вижу, что на самом деле правила должны иметь либо категорию, либо теги в качестве первого параметра. Если категория найдена, то не читайте другие правила. Если нет, проверьте, является ли первый параметр тегами и т. Д. и т. Д. Действительно. Я не знаю, как я этого не понял. Возможно, я неправильно понял проблему.