#.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 после нее.