首页 > 解决方案 > Mod重写uri中第一个斜杠内的通配符问题

问题描述

我想这样重写:

  /v2/auth /v2/myphp.php
  /v1/auth /v1/myphp.php

应该很简单,但我遇到了问题。这是一个最终应该做我想做的事情的例子,重写条件有效,但重写失败:

RewriteCond %{REQUEST_URI} ^/v\d+/auth$ [NC]
RewriteRule "^.*(v\d+).*$" "/$1/myphp.php" [L]

下面的重写适用于http://mydomaindotcom/v2/auth

  RewriteRule "^.*auth$" "/v2/myphp.php" [L]

但这也适用于相同的网址:

  RewriteRule "^.*a.*$" "/v2/myphp.php" [L]

但这失败了,我想这表明在第一个斜杠中捕捉到什么是一个问题?:

  RewriteRule "^.*v.*$" "/v2/myphp.php" [L]

将不胜感激任何帮助来解决这个问题!

标签: apachemod-rewrite

解决方案


您的 RewriteCond 将检查它是否为“/vDIGITS/auth”,其中 DIGITS 为 [0-9]。所以你的线:

RewriteCond %{REQUEST_URI} ^/v\d+/auth$ [NC]

没关系。 \d+匹配至少一位数字。那里没问题。

然后,您的 RewriteRule 将获取 DIGITS 并使用它来构建您的目标。因此,使用 RewriteCond 中的相同正则表达式并添加括号,如下所示:

RewriteRule "^/(v\d+)/auth$" "/$1/myphp.php" [L]

由于您知道 RewriteCond 与该正则表达式匹配,因此在 RewriteRule 中使用它是双赢的。

仅供参考,您希望浏览器让您独自处理未来的请求,请在“L”标志之后使用标志“R = 301”使重写永久化。


推荐阅读