URL重写正则表达式以适应所有

时间:2013-05-21 23:17:41

标签: php regex .htaccess url-rewriting web-config

简要说明

我正在努力想出一种智能的方法来控制我的网页重写,尽可能少的重写。

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

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

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

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

然后匹配将被放入网址中,如此(请注意,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'

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

我不希望个人重写的原因之一是我不只是在谈论货运,我需要别名的文件很多,因此我不愿意将多重重写路由作为我的网络。配置文件会变得非常大。

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

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

    我想不出另一种(更好的)这样做的方式,你们中的任何人都可以吗?

1 个答案:

答案 0 :(得分:1)

由于您只有1个例外,为什么不添加一个例外?

我们将使用“重写重写技术”(我只想出了那个名字lol)

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上测试。