У меня есть веб-сайт, основанный на странице поиска, на которой отображается список, а затем - страница с подробностями о товарах.
если посетители используют 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-адреса не соответствовали одному шаблону, например, изменив второй шаблон на ^[^/](.*)$
.)