Назад | Перейти на главную страницу

Использование нескольких правил перезаписи .htaccess

У меня есть веб-сайт, основанный на странице поиска, на которой отображается список, а затем - страница с подробностями о товарах.

если посетители используют rootdomain.com/searchterm, следует перенаправить на rootdomain.com/index.php?keyword=searchterm.

Я работал над деталями rootdomain.com/detail/productname, следует перенаправить на rootdomain.com/detail.php?name=productname

и вот я терплю поражение

Меня все время перенаправляют на index.php с моим $ 1 как 'detail / productname'

это мое .htacces до сих пор:

RewriteEngine on
RewriteCond $1 !^(index\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/detail/(.*)$  detail.php?name=$1 [L,QSA] -> L here doesn't work either. 
RewriteRule ^(.*)$ index.php?keyword=$1 [L,QSA]

Обновить

Хорошо, теперь я очень близко

Проблема заключалась в том, что условие перезаписи действительно только для следующего правила, поэтому я должен повторить это явно, я также добавил ignore detail.php в первое условие, потому что мое перенаправление на детали было снова перенаправлено на индекс. теперь по какой-то причине мое условие для -f, похоже, не работает с деталями / все мои css и изображения не работают. как лучше всего их исключить

RewriteEngine on
RewriteCond $1 !^(index\.php|detail\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^detail/(.*)$  detail.php?name=$1 [L,QSA] 

RewriteCond $1 !^(index\.php|detail\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?keyword=$1 [L,QSA]

Обновление 2

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

RewriteEngine on
RewriteCond $1 !^(index\.php|detail\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^detail/(images|css|js)/(.*)$  $1/$2 [L,QSA] 

RewriteCond $1 !^(index\.php|detail\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^detail/(.*)$  detail.php?name=$1 [L,QSA] 

RewriteCond $1 !^(index\.php|detail\.php|resources|robots\.txt|\.png)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?keyword=$1 [L,QSA]

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

Что произошло, первая версия, перенаправление с detail / something работало, но затем было перенаправлено на index.php? Keyword = detail.php? Name = something, поэтому мне пришлось исключить detail.php в первой строке условия. Также rewriteCond действительны для следующего правила, а не для всех. поэтому мне пришлось их повторить.

Наконец, чтобы мои изображения и css работали, мне пришлось переписать их на базовый URL-адрес для 3 папок, в которых у меня есть изображения / css / js.

Если это можно сделать короче или более достаточным, не стесняйтесь делать это.

RewriteEngine on
RewriteCond $1 !^(index\.php|detail\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^detail/(images|css|js)/(.*)$  $1/$2 [L,QSA] 

RewriteCond $1 !^(index\.php|detail\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^detail/(.*)$  detail.php?name=$1 [L,QSA] 

RewriteCond $1 !^(index\.php|detail\.php|resources|robots\.txt|\.png)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?keyword=$1 [L,QSA]

--edit это все еще не кажется надежным, когда используются детали с кодировкой urlencoded за деталью / ...

Вам нужно добавить L ('последний') флаг к первому RewriteRule:

RewriteRule ^/detail/(.*)$  detail.php?name=$2 [L,QSA]

Согласно документацияэтот флаг будет:

Остановите здесь процесс перезаписи и больше не применяйте правила перезаписи. Это соответствует последней команде Perl или команде break в C. Используйте этот флаг, чтобы предотвратить дальнейшую перезапись перезаписываемого URL-адреса по следующим правилам.

Без него Apache продолжает применять второе правило перезаписи после сопоставления с первым. Поскольку второе правило влияет на все, оно отменяет первое. (Еще одно решение - написать шаблоны так, чтобы два URL-адреса не соответствовали одному шаблону, например, изменив второй шаблон на ^[^/](.*)$.)