Переменная PHP $_GET пуста из-за перезаписи URL

#php #html #apache #.htaccess #mod-rewrite

#php #HTML #apache #.htaccess #мод-перезапись

Вопрос:

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

В моем файле .htaccess я попробовал несколько способов устранить проблему, но ничего не сработало.

 RewriteEngine On
[some code]
RewriteRule ^([a-zA-Z0-9_-] )/?$ ?site=$1
  

Я попробовал эту перезапись, чтобы посмотреть, работает ли она:

 RewriteRule ^search?q=g ?site=searchamp;q=g
  

Но если я print_r($_GET) использую PHP, я просто получу Array ( [site] => search )
Попробуйтеhttp://kwtsports.bplaced.de/search?q=g .

У меня есть поле поиска, которое перенаправляет на /search?q=blablaSearchQuery , но, как я уже сказал, $_GET['q'] пустое.

Это также не работает:

 RewriteRule ^search?q=([a-zA-Z0-9_-] )/?$ ?site=searchamp;q=$1
  

Кто-нибудь знает, почему это происходит?

Ответ №1:

Добавьте [QSA] в конец вашего RewriteRule . При этом к результату добавляется старая строка запроса.

Смотрите документы для получения дополнительной информации.

Ответ №2:

Кто-нибудь знает, почему это происходит?

ДА. Вы не можете протестировать строку запроса в правиле перезаписи, поэтому эта часть вашего правила никогда не будет работать: RewriteRule ^search?q=g .

Если вы хотите протестировать строку запроса, вы должны протестировать ее в rewrite cond.

Например, для вашего RewriteRule ^search?q=g?site=searchamp;q=g примера вам пришлось бы сделать что-то вроде этого:

 RewriteCond %{QUERY_STRING} ^q=([^amp;] )
RewriteRule ^search/?$ site=searchamp;q=%1 [L]
  

В данном конкретном случае, поскольку вы не хотите изменять q значение, нам на самом деле не нужно его тестировать, и вы можете просто передать его с помощью QSA опции после добавления site=search :

 RewriteRule ^search/?$ site=search [L,QSA]