如何在redirect上模拟Apache 标志?

出于商业原因,我为Apache 2.2.22(mod_rewrite)创build了以下重写规则:

RewriteRule /site/(\d+)/([^/]+)\.html /site/$2/$1 [R=301,L] 

如果给出了这样的url: http: //www.mydomain.com/site/ 0999 / document.html

被翻译成: http : //www.mydomain.com/site/ document / 0999 .html

这是预期的情况。 但是,有名称只是数字的文件。 所以考虑下面的情况:

http://www.mydomain.com/site/ 0055/0666 .html

获取翻译成:

http://www.mydomain.com/site/ 0666/0055 .html

这也符合我的重写规则模式,所以我最终浏览器的“网页导致了太多的redirect”错误。

我研究了很长时间,没有find“好”的解决scheme。 我试过的东西:

  1. 使用[END]标志。 不幸的是我的Apache版本不可用,也不适用于redirect。

  2. 在RewriteCond子句上使用%{ENV:REDIRECT_STATUS}来结束重写过程(L)。 出于某种原因,%{ENV:REDIRECT_STATUS}在我尝试的所有时间都是空的。

  3. 如果我的规则匹配,添加一个带有Header子句的响应头,然后检查这个头( 详情请看这里 )。 似乎a)REDIRECT_addHeader为空b)标题不能明确地设置在301响应上。

还有另一种select。 我可以设置一个查询参数的redirectURL,这表明它来自redirect,但我不喜欢这个解决scheme,因为它似乎hacky。

有没有一种方法可以完成[END]标志的function,但是在旧的Apache版本中呢? 比如我的2.2.22。

谢谢!

添加一个查询参数到redirect是最好的select。 由于各种原因,经常这样做。

例如,使这样的规则:

 RewriteCond %{QUERY_STRING} !redirected RewriteRule /site/(\d+)/([^/]+)\.html /site/$2/$1?redirected [R=301,L] 

现在发生的事情是,redirect到了“?redirect”的URL。 所以这个规则不是第二次应用。

[END]标志在这里不相关,因为你正在服务301redirect。 而作为你链接到状态的文件…

这不适用于来自外部redirect的新请求。

如果你真的需要做这样的redirect,那么你需要find一些其他的方式来消除旧的和新的URL。