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

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

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

此外,如果有可能,我喜欢将'/ config / new'之类的内容与'config_new.php'相匹配。我猜一些正则表达式会让我做到这一点吗?

有帮助吗?

解决方案

尝试:

RewriteRule ^ /?(\ w +)/?$ $ 1.php

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

编辑:对于其他匹配,请尝试:

RewriteRule ^ /?(\ w +)/(\ w +)/?$ $ 1_ $ 2.php

其他提示

我会做这样的事情:

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

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

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

Mod重写不能像你想要在问题的第二部分那样做(可能)无限的替换。但请查看 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 

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

  

外部重写引擎

     

说明

     

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

     

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

<*>      

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

; }
     

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

scroll top