Использование обратной ссылки после перезаписи во вторую очередь в htaccess

#.htaccess #mod-rewrite #backreference

#.htaccess #мод-перезапись #обратная ссылка

Вопрос:

У меня есть:

 RewriteCond %{HTTP_HOST} ^my.domain.com$ [NC]
RewriteRule ^(.*)$ index.php?q=searchamp;keyword=$1
  

Ввод:

 my.domain.com/foo_bar
  

Я хочу:

 index.php?q=searchamp;keyword=foo_bar
  

Но на самом деле:

 index.php?q=searchamp;keyword=index.php
  

Я не понимаю, почему. Пожалуйста, помогите мне!

Ответ №1:

Ваше правило перезаписи фактически переписывает дважды, один раз для /foo_bar и второй раз для index.php поскольку .* соответствует чему угодно.

Вам просто нужно добавить 2 условия, чтобы остановить перезапись для файлов и каталогов:

 # handle landing page
RewriteCond %{HTTP_HOST} ^my.domain.com$ [NC]
RewriteRule ^/?$ index.php?q=search [L,QSA]

# handle /foo_bar
RewriteCond %{HTTP_HOST} ^my.domain.com$ [NC]
# If the request is not for a valid directory
RewriteCond %{REQUEST_FILENAME} !-d
# If the request is not for a valid file
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(. )$ index.php?q=searchamp;keyword=$1 [L,QSA]
  

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

1. Это сработало. Но это также меняет мой URL-путь. У меня есть «domain.com » и поддомен»my.domain.com » укажите на 1 каталог вместе. Файл htaccess находится в корневом каталоге. Я хочу написать приведенный выше код для определения того, когда URL my.domain.com . Но я также хочу сохранить поддомен в URL. Ваш код изменяет URL на: domain.com/search/foo_bar . Я ожидал: my.domain.com/foo_bar вместо этого. Спасибо!

2. Нет, это правило не изменяет URL (это просто внутренняя перезапись). У вас либо старый кеш браузера, либо какие-то другие правила. Убедитесь, что вы тестируете после очистки кэша браузера и тестируете только с этим правилом в .htaccess

3. Можете ли вы научить меня еще чему-нибудь? Если я хочу 2 rewriterule, например: «my.domain.com => index.php?q=поиск» и «my.domain.com/foo_bar => index.php?q= search amp; keyword=foo_bar» тогда я должен дублировать перезапись секунды? Я слышал, что одна перезапись активна только для одного RewriteRule после нее.