Apache mod_在.htaccess文件中重写未知路径的第一部分

Apache mod_在.htaccess文件中重写未知路径的第一部分,apache,.htaccess,mod-rewrite,Apache,.htaccess,Mod Rewrite,我试图编写一个重写规则,将路径段塞更改为查询参数。它适用于web服务,只有在主机以api启动时才应重写此规则。有两个鼻涕虫,我正试图捕捉和重写。第一个是可选的,是一个版本(即v1.2),第二个是服务域(即客户、交易等) 应重写为?版本=2.5和域=客户 我还希望支持默认版本,以便 应重写为?版本=&域=客户 下面是我的.htaccess文件的外观: RewriteEngine On RewriteBase / RewriteCond %{HTTP_HOST} ^api\..* RewriteR

我试图编写一个重写规则,将路径段塞更改为查询参数。它适用于web服务,只有在主机以api启动时才应重写此规则。有两个鼻涕虫,我正试图捕捉和重写。第一个是可选的,是一个版本(即v1.2),第二个是服务域(即客户、交易等)

应重写为?版本=2.5和域=客户

我还希望支持默认版本,以便

应重写为?版本=&域=客户

下面是我的.htaccess文件的外观:

RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} ^api\..*
RewriteRule ^v([\d\.]*)?\/?([^\/]*)$ ?version=$1&domain=$2
上面的第一个示例运行良好,但我无法使用默认版本路径。我试过很多不同的东西。我原以为以^.*v开头会有帮助,但事实并非如此。当你不知道起始字符时,有人知道如何匹配吗?

试试:

RewriteCond %{HTTP_HOST} ^api\..*
RewriteCond %{QUERY_STRING} !version=
RewriteRule ^(v([\d\.]*))?\/?([^\/]*)$ /?version=$2&domain=$3 [L]
这使得
/v
部件成为可选部件:

  • /v2.5/foo
    ->
    /?version=2.5&domain=foo
  • /foo
    ->
    /?版本=&domain=foo
  • /v/foo
    ->
    /?版本=&domain=foo
试试:

这使得
/v
部件成为可选部件:

  • /v2.5/foo
    ->
    /?version=2.5&domain=foo
  • /foo
    ->
    /?版本=&domain=foo
  • /v/foo
    ->
    /?版本=&domain=foo

@ChristopherMartin忘了它会在你身上循环,添加
RewriteCond%{QUERY\u STRING}!version=
就在规则之前(与HTTP\U主机条件一起),谢谢!这很有魅力。我真的不确定发生了什么事。我认为将分组放在整个第一部分周围并使其成为可选的将是可行的。为什么它会给我一个500服务器错误?你介意解释一下吗?@ChristopherMartin重写引擎继续循环所有规则,直到应用规则后进入引擎的URI相同。如果没有某种方法阻止它(比如检查以确保
version=
不存在),它将在apache放弃并返回500@ChristopherMartin忘了它会在你身上循环,添加
RewriteCond%{QUERY\u STRING}!version=
就在规则之前(与HTTP\U主机条件一起),谢谢!这很有魅力。我真的不确定发生了什么事。我认为将分组放在整个第一部分周围并使其成为可选的将是可行的。为什么它会给我一个500服务器错误?你介意解释一下吗?@ChristopherMartin重写引擎继续循环所有规则,直到应用规则后进入引擎的URI相同。如果没有某种方法来阻止它(比如检查以确保
version=
不在那里),它将在apache放弃并返回500之前循环多次