столкновение правил htaccess Rerwite

#apache #.htaccess #mod-rewrite #url-rewriting #friendly-url

Вопрос:

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

artistmusic.php

 From: http://www.example.com/artistmusic?slug=Ben
To: http://www.example.com/Ben/music
 

artistvideos.php

 From: http://www.example.com/artistvideos?slug=Ben
To: http://www.example.com/Ben/videos
 

Перепишите правило для вышеуказанных URL-адресов.

 RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]*)/([^/]*)$ /artist$2?address=$1 [L]
 

Это работает так, как и должно быть, пока я не добавлю правило перезаписи для набора URL-адресов ниже.

allsongs.php

 From: http://www.example.com/allsongs?standard=popularamp;request=monthly
To: http://www.example.com/songs/popular/monthly
 

allartists.php

 From: http://www.example.com/allartists?standard=popularamp;request=monthly
To: http://www.example.com/artists/popular/monthly
 

Перепишите правило для второго набора выше.

 RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]*)/([^/]*)/([^/]*)$ /all$1?standard=$2amp;request=$3
 

Приведенное выше правило работает, но убивает первое.
В чем причина этого? Спасибо.

Ответ №1:

С показанными вами образцами/попытками, пожалуйста, создайте файл правил htaccess следующим образом. Пожалуйста, не забудьте очистить кэш вашего браузера перед тестированием ваших URL-адресов.

 RewriteEngine ON
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^songs/([^/]*)/([^/]*)/?$ allsongs.php?standard=$1amp;request=$2 [NC,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^artists/([^/]*)/([^/]*)/?$ allartists.php?standard=$1amp;request=$2 [NC,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)/(music|videos)/?$ artist$2.php?slug=$1 [QSA,NC,L]
 


Общее решение: В случае, если вы не хотите жестко кодировать значения в своих новых правилах, попробуйте выполнить следующее. Убедитесь, что вы используете либо выше, ЛИБО после только 1 за раз.

 RewriteEngine ON
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/?$ all$1.php?standard=$2amp;request=$3 [QSA,NC,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)/([^/]*)/?$ artist$2.php?slug=$1 [QSA,NC,L]
 

Комментарии:

1. @Busker McGreen Брайан, не могли бы вы, пожалуйста, сообщить мне, сработали ли для вас эти Правила?