Htaccess查询字符串冲突

时间:2014-06-13 12:05:08

标签: php apache .htaccess mod-rewrite

我希望通过查询字符串将域,子域和请求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=%2&sub=%1&req=$1 [QSA,END]

以下是一些工作示例:

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

=> /index.php?app=testdomain&sub=dev&req=/hello/world

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

=> /index.php?app=example&sub=www&req=/&var=test

但如果我有这样的事情:

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

=> /index.php?app=testdomain&sub=dev&req=/hello/world&app=FAIL&sub=FAIL&req=FAIL

查询字符串将使用FAIL(或来自url查询字符串的所有其他内容)替换域,子域和请求uri 变量。 我可以取消激活[QSA]标志,但我想保留原始查询字符串,并阻止app, sub, req变量重写。

1 个答案:

答案 0 :(得分:0)

您可以从查询字符串中删除app,sub和req参数,并使用PHP $_SERVER var。这个PHP超全局包含一些有趣的值来解决您的问题:

http://dev.testdomain.tld/hello/world?app=FAIL&sub=FAIL&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。