现在我正在做这样的事情:
RewriteRule ^/?logout(/)?$ logout.php
RewriteRule ^/?config(/)?$ config.php
我宁愿有一个规则可以为每个网址做同样的事情,所以每次添加新文件时我都不必继续添加它们。
此外,如果有可能,我喜欢将'/ config / new'之类的内容与'config_new.php'相匹配。我猜一些正则表达式会让我做到这一点吗?
答案 0 :(得分:2)
尝试:
RewriteRule ^ /?(\ w +)/?$ $ 1.php
$ 1是括号中第一个捕获的字符串的内容。不需要第二个斜杠周围的括号。
编辑:对于其他匹配,请尝试:
RewriteRule ^ /?(\ w +)/(\ w +)/?$ $ 1_ $ 2.php
答案 1 :(得分:2)
我会做这样的事情:
RewriteRule ^/?(logout|config|foo)/?$ $1.php
RewriteRule ^/?(logout|config|foo)/(new|edit|delete)$ $1_$2.php
我更喜欢明确列出我想要匹配的网址,这样我就不必担心静态内容或以后添加新内容而不需要重写为php文件。
如果所有子网址对所有根网址都有效(book/new
,movie/new
,user/new
),则上述情况可以正常,但如果您想要根据不同的子网址,则不太好关于根行动(logout/new
没有多大意义)。您可以使用更复杂的正则表达式处理它,或者将所有内容路由到单个php文件,该文件将根据URL确定要包含和显示的文件。
答案 2 :(得分:1)
Mod重写不能像你想要在问题的第二部分那样做(可能)无限的替换。但请查看Apache URL Rewriting Guide:
底部的外部重写引擎外部重写引擎
说明
常见问题解答:我们如何解决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 / ....实际上,您可以编写任何您喜欢的程序。但请注意,虽然普通用户也可以使用此类地图,但只有系统管理员才能定义它。