htaccess mod_rewrite:所有URI只有一个规则

时间:2011-12-02 15:40:34

标签: .htaccess url mod-rewrite url-rewriting rewrite

我阅读了一些有关mod重写的教程,但我找不到我要找的内容。我想要的所有URI只需要一个RewriteRule:

  • 我希望' - '替换为'_'。所以如果我有example.com/page-hello应该重写为example.com/page_hello
  • 每个网址都应该替换为.php。所以,如果我有example.com/page,则应该重写为example.com/page.php

所以我的问题是,如何实现这一目标?

2 个答案:

答案 0 :(得分:2)

您需要单独的规则来执行此操作。第一个规则将依赖于mod_rewrite循环,直到没有破折号,第二个规则将检查是否没有破折号并且它不是现有文件然后将php附加到结尾:

# Replace - with _
RewriteRule ^(.*)-(.*)$ /$1_$2

# When there are no more -, check if the file exists
RewriteCond %{REQUEST_URI} !-
RewriteCond %{REQUEST_URI} !\.php$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ %{REQUEST_URI}.php [L]

这两条规则将采用这样的网址:

  

http://example.com/asd-fgh-jkl-/qwe-rty-uio

并将URI重写为:

  

/asd_fgh_jkl_/qwe_rty_uio.php

答案 1 :(得分:0)

如果您要重写的内容中有多个“ - ”,则可能会出现问题。要解决此问题,请使用执行外部“过滤器”的RewriteMap指令。见here。 从网站上,重点关注您的外观:

外部重写计划

MapType:prg,MapSource:Unix文件系统到有效常规文件的路径 这里的源是程序,而不是映射文件。要创建,您可以使用您选择的语言,但结果必须是可执行程序(对象代码或带有魔术cookie技巧的脚本'#!/ path / to / interpreter '作为第一行。)

该程序在Apache服务器启动时启动一次,然后通过其stdin和stdout文件句柄与重写引擎通信。

所以我的建议是:在python中创建一个非常简单的程序来执行搜索/替换并使用RewriteMap指令调用它,然后将php添加到它。