1

现在我正在做这样的事情:

RewriteRule ^/?logout(/)?$ logout.php
RewriteRule ^/?config(/)?$ config.php

我宁愿有一个规则可以为每个 url 做同样的事情,所以我不必在每次添加新文件时都添加它们。

另外,如果可能的话,我喜欢将“/config/new”之类的内容与“config_new.php”相匹配。我猜一些正则表达式会让我完成这个?

4

3 回答 3

2

尝试:

重写规则 ^/?(\w+)/?$ $1.php

$1 是括号中第一个捕获的字符串的内容。不需要第二个斜线周围的括号。

编辑:对于另一场比赛,试试这个:

重写规则 ^/?(\w+)/(\w+)/?$ $1_$2.php

于 2008-09-19T19:01:50.193 回答
2

我会做这样的事情:

RewriteRule ^/?(logout|config|foo)/?$ $1.php
RewriteRule ^/?(logout|config|foo)/(new|edit|delete)$ $1_$2.php

我更喜欢明确列出我想要匹配的 url,这样我就不必担心静态内容或以后添加不需要重写到 php 文件的新内容。

如果所有子 url 对所有根 url ( book/new, movie/new, user/new) 都有效,则上述方法是可以的,但如果您想根据根操作 (logout/new没有多大意义) 拥有不同的子 url,则不是很好。您可以使用更复杂的正则表达式来处理它,或者将所有内容路由到单个 php 文件,该文件将根据 url 确定要包含和显示的文件。

于 2008-09-19T19:07:30.587 回答
1

Mod rewrite 不能像您在问题的第二部分中那样做(可能)无限的替换。但请查看Apache URL 重写指南底部的外部重写引擎:

外部重写引擎

描述:

常见问题解答:我们如何解决 FOO/BAR/QUUX/等问题。问题?使用 mod_rewrite 似乎没有解决方案...解决方案:

使用一个外部的 RewriteMap,即一个类似于 RewriteMap 的程序。它在 Apache 启动时运行一次,在 STDIN 上接收请求的 URL,并且必须将结果(通常重写)的 URL 放在 STDOUT 上(相同的顺序!)。

RewriteEngine on
RewriteMap    quux-map       prg:/path/to/map.quux.pl
RewriteRule   ^/~quux/(.*)$  /~quux/${quux-map:$1}

#!/path/to/perl

#   disable buffered I/O which would lead
#   to deadloops for the Apache server
$| = 1;

#   read URLs one per line from stdin and
#   generate substitution URL on stdout
while (<>) {
    s|^foo/|bar/|;
    print $_;
}

这是一个仅用于演示的示例,只是将所有 URL /~quux/foo/... 重写为 /~quux/bar/...。实际上您可以编写任何您喜欢的程序。但请注意,虽然普通用户也可以使用此类地图,但只有系统管理员可以定义它。

于 2008-09-19T19:04:32.903 回答