比较 RewriteCond 中的两个反向引用

问题描述 投票:0回答:1

这是旧的 URI 模式

/release-(\w+)/(\w+)/(.*)
,其中第一个和第二个正则表达式模式始终相同,示例如下:

  • /release-foo/foo/(.*)
  • /release-bar/bar/(.*)
  • 等等

它们被合并在一个文件夹下(即

/release
),在新版本中:

ROOT
└── release
    ├── foo
    │   ├── ...
    │   └── ...
    ├── bar
    │   ├── ...
    │   └── ...
    └── ...

有了这个

RewriteRule
配置:

RewriteRule "^/release-(\w+)/(\w+)/(.*)$"  "/release/$1/$3" [L]

所有这些重定向都有效:

  • /release-foo/foo/(.*)
    =>
    /release/foo/(.*)
    :这是有意的
  • /release-foo/bar/(.*)
    =>
    /release/foo/(.*)
    :这是不允许的
  • /release-foo/baz/(.*)
    =>
    /release/foo/(.*)
    :这是不允许的

我的问题是我可以在这里放什么作为

RewriteCond
?这有可能吗?

RewriteCond expr "$2 == $1"   <-- what do I need to put here?
RewriteRule "^/release-(\w+)/(\w+)/(.*)$"  "/release/$1/$3"     [L]

RewriteCond expr "$2 != $1"   <-- what do I need to put here?
RewriteRule "^/release-(\w+)/(\w+)/(.*)$"  "/release-$1/$1/$3"  [R,L]

我想做的是检查

RewriteCond
中的两个反向引用,如果
$2 is equal to $1
(例如
/release-foo/foo/
)让它被处理。但如果它们不同(例如
/release-foo/bar/
),则从外部将其重定向到正确的 URI。我需要
RewriteCond
否则它会陷入无限循环。

我已经尝试了Apache HTTP Server中的表达式中的几乎所有内容,甚至硬编码也不起作用,如下所示:

RewriteCond expr "$2 == 'foo'"

非常感谢任何指点。

apache mod-rewrite apache2.4
1个回答
0
投票

一个高级/巧妙的技巧是您可以在表达式中用作反向引用。

RewriteRule "^/release-(\w+)/\1/(.*)$"  "/release/$1/$2" [L]
© www.soinside.com 2019 - 2024. All rights reserved.