从查询字符串中删除问号

时间:2015-07-23 13:13:45

标签: php apache mod-rewrite nginx

我的目标:将网址从 host.com/?abc 重写为 host.com/abc ,并可以通过$ _SERVER ['QUERY_STRING']申请。我发现了以下规则:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /?$1 [L,QSA]

但无论出于何种原因,我的$ _SERVER ['QUERY_STRING']都是空的,除非我把'?'在查询字符串前面。当我执行print_r($ _SERVER)或print_r($ _GET)时,我的查询字符串不存在于任何地方。我有什么错误吗?谢谢!

UPDATE; 我正在使用nginx作为“前端”代理,并使用以下规则将请求重定向到apache:

 server
 {
  listen   80;

  root /var/hosts/hostcom;
  index index.php index.html index.htm;

  server_name host.com;

  location / {
    try_files $uri $uri/ /index.php;
  }

  location ~ \.php$ {

          proxy_set_header X-Real-IP        $remote_addr;
          proxy_set_header X-Forwarded-For  $remote_addr;
          proxy_set_header Host $host;
          proxy_pass http://127.0.0.1:8010;

   }

   location ~ /\.ht {
          deny all;
  }
 }

如果我直接请求apache端口,它运行host.com:8010/?abc,但不是通过nginx,任何建议?谢谢!

1 个答案:

答案 0 :(得分:1)

来自nginx docs

  

如果找不到任何文件,则内部重定向到uri   在最后一个参数中指定。

try_files将对不存在的文件的任何请求重写为index.php,在它到达Apache之前丢失路径。

我相信您的位置块看起来应该更像这样,它应该将任何丢失文件的请求转发给Apache而不重写它:

  location / {
    try_files $uri $uri/ @apache;
  }

  location @apache {
          proxy_set_header X-Real-IP        $remote_addr;
          proxy_set_header X-Forwarded-For  $remote_addr;
          proxy_set_header Host $host;
          proxy_pass http://127.0.0.1:8010;
   }