现在我正在做这样的事情:
RewriteRule ^/?logout(/)?$ logout.php
RewriteRule ^/?config(/)?$ config.php
我宁愿有一个规则可以为每个 url 做同样的事情,所以我不必在每次添加新文件时都添加它们。
另外,如果可能的话,我喜欢将“/config/new”之类的内容与“config_new.php”相匹配。我猜一些正则表达式会让我完成这个?
现在我正在做这样的事情:
RewriteRule ^/?logout(/)?$ logout.php
RewriteRule ^/?config(/)?$ config.php
我宁愿有一个规则可以为每个 url 做同样的事情,所以我不必在每次添加新文件时都添加它们。
另外,如果可能的话,我喜欢将“/config/new”之类的内容与“config_new.php”相匹配。我猜一些正则表达式会让我完成这个?
尝试:
重写规则 ^/?(\w+)/?$ $1.php
$1 是括号中第一个捕获的字符串的内容。不需要第二个斜线周围的括号。
编辑:对于另一场比赛,试试这个:
重写规则 ^/?(\w+)/(\w+)/?$ $1_$2.php
我会做这样的事情:
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 确定要包含和显示的文件。
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/...。实际上您可以编写任何您喜欢的程序。但请注意,虽然普通用户也可以使用此类地图,但只有系统管理员可以定义它。