Конфликты строк запроса Htaccess

#php #apache #.htaccess #mod-rewrite

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

Вопрос:

Я бы хотел переписать URL-адреса, передав домен, поддомен и запросить uri в php-файл с помощью строки запроса со следующим .htaccess

 # Apache configuration

    Options -Indexes
    Options -Multiviews
    Options  FollowSymLinks


# Rewrite engine configuration

    RewriteEngine on
    RewriteBase /


# Sub domain redirection (301 redirect)

    RewriteCond %{HTTP_HOST} ^([^.] .[^.0-9] )$
    RewriteRule ^(.*)$ http://www.%1/$1 [R=301,L]


# Request redirection

    RewriteCond %{HTTP_HOST} ^([^.] ).([^.] ).[^.0-9] $
    RewriteRule ^(.*)$ index.php?app=%2amp;sub=%1amp;req=$1 [QSA,END]
  

Вот несколько рабочих примеров :

 http://dev.testdomain.tld/hello/world

=> /index.php?app=testdomainamp;sub=devamp;req=/hello/world
  

И

 http://www.example.tld/?var=test

=> /index.php?app=exampleamp;sub=wwwamp;req=/amp;var=test
  

Но если у меня есть что-то вроде этого :

 http://dev.testdomain.tld/hello/world?app=FAILamp;sub=FAILamp;req=FAIL

=> /index.php?app=testdomainamp;sub=devamp;req=/hello/worldamp;app=FAILamp;sub=FAILamp;req=FAIL
  

Строка запроса заменит переменные домена, поддомена и uri запроса FAIL на (или все остальное из строки запроса url).
Я мог бы [QSA] отключить флаг, но я хотел бы сохранить исходную строку запроса и предотвратить app, sub, req перезапись переменных.

Ответ №1:

Вы можете удалить параметры app, sub и req из строки запроса и использовать PHP $_SERVER var. Этот суперглобальный PHP содержит несколько интересных значений для решения вашей проблемы:

 http://dev.testdomain.tld/hello/world?app=FAILamp;sub=FAILamp;req=FAIL

var_dump($_SERVER);
  

Приведет к следующему выводу:

 array(...) {
  ["HTTP_HOST"]=>
  string(13) "test.test.tld"
  ["QUERY_STRING"]=>
  string(9) "hahah=w12"
  ["REQUEST_URI"]=>
  string(28) "/~stejanse/tst.php?hahah=w12"
}
  

Вы могли бы использовать эти переменные для извлечения вашей информации вместо использования mod_rewrite .