2

简要说明

我试图想出一种聪明的方法来控制我的网页重写,尽可能少地重写。

因此,例如,如果您有以下页面翻译:

'domain.com/test/'        => 'domain.com/test.php'
'domain.com/errors/404/'  => 'domain.com/errors.php?code=404' 

可以对每一页进行单独的重写......但是,我喜欢通过使用一个适合所有人的正则表达式来最小化这种情况。所以匹配上面的正则表达式是:

^([a-z0-9\-]+)\/?([a-z0-9\-]+)?\/?$

然后将匹配项放入 URL 中,如下所示(注意在错误页面code上将替换为request) :

domain.com/$1.php?request=$2

然后你可以附加查询字符串......

显然在某些情况下您需要单独重写,但您通常可以通过使用巧妙的正则表达式和结构良好的页面来最小化这种情况。

我的问题

与上面的示例类似,我的网站中有一些页面是用这个精确的正则表达式重写的。所以以下页面翻译如下:

'domain.com/shipments/open/' => 'domain.com/shipments.php?request=open'
'domain.com/settings/user/'  => 'domain.com/settings.php?request=user'
etc...

但是,出于我不会深入讨论的原因,我也有这样的页面:

'domain.com/shipment/edit'

注意它说的是装运而不是装运!尽管如此,我仍然希望将其重写到发货页面。所以翻译看起来像这样:

'domain.com/shipment/edit' => 'domain.com/shipments.php?request=edit'

除了另一种重写指定货件是货件别名之外,我想不出其他方法...

我不希望为此进行单独重写的原因之一是我不只是在谈论发货,还有很多文档需要别名,因此我不想像我的 web.config 文件那样走多次重写路线变得非常大。

我提出了以下解决方案(但显然我对它们不满意):

  1. 在我的根目录中有一个名为 shipping.php 的页面,只包含 shipping.php 的内容
  2. 使用别名为每个页面编写重写...

我想不出另一种(更好的)方法来做到这一点,你们中的任何一个都可以吗?

4

1 回答 1

1

既然你只有 1 个例外,为什么不添加那个例外呢?

我们将使用“重写重写技术”(我只是想出了这个名字,哈哈)

RewriteEngine On

RewriteRule ^([a-z0-9-]+[^s/])s*/?([a-z0-9-]+)?/?$ $1s/$2 [NC]

RewriteRule ^([a-z0-9-]+)/?([a-z0-9-]+)?/?$ $1.php?request=$2

在 localhost 和这个RewriteRuleTester上测试。

于 2013-05-22T00:30:35.053 回答