如何使用mod_rewrite重命名url中的模块

时间:2012-05-18 17:54:37

标签: .htaccess mod-rewrite apache2

我正在使用MVC和/< module> /< controller> /< action> /在example.com/module/whatever上有一个模块,我需要'重命名'到example.com/模块一/不管。整个应用程序已经编写好了,所以我不能在我的代码中到处更改它,所以我希望用mod_rewrite来做。我试过以下

RewriteCond %{THE_REQUEST} ^GET\ /module/
RewriteRule ^module/(.*) /module-a/$1 [L,R=301]

我做了我想要的重定向所有网址,例如example.com/module/whatever example.com/module-a/whatever,但现在我需要'module-a'的所有请求在内部重写为“模块”。它还需要适用于模块根目录(例如,没有尾部斜杠的example.com/module)。这可能吗?我添加了

RewriteRule ^module-a/(.*)$ module/$1

直接在上述条件和规则之下,但是当访问该页面时,它仍然表示找不到模块“module-a”。


修改

我还有一些规则,我认为它们不会影响到这一点,但无论如何它们仍然存在:

RewriteCond %{REQUEST_FILENAME} -s [OR] 
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L] 

解决方案

我最终使用

RewriteCond %{THE_REQUEST} ^GET\ /module/
RewriteRule ^module$ /module-a [L,R=301]
RewriteRule ^module/(.*) /module-a/$1 [L,R=301]

将所有链接从模块重定向到模块-a。我必须使用2条规则,因为我不知道正则表达式是否足以组合它们,处理url example.com/module的特殊情况。

要在内部重写,我原来的规则通常会起作用,但Zend似乎做了一些覆盖它的东西,所以我不得不用路由处理它。见rename a zend module with routes

1 个答案:

答案 0 :(得分:0)

如果我理解正确,那你就从错误的方向走了出来。我也不清楚你的RewriteCond的用途

您希望所有模块-a / *请求在内部作为模块/ *处理,因此您只需要一个简单的重写::

RewriteRule ^ module -a /?(。*)/ module / $ 1 [L]

我怀疑你遇到的问题是网站上的所有引用/模块/而不是/ module-a /的内部链接,但是将301放在那里将导致无问题(尤其是搜索引擎),以及随后的重写你可能属于循环引用。您最好更改应用程序中的链接代码(如果您有链接抽象类),或者最糟糕的是使用输出缓冲来在呈现页面之前交换所有链接。

注意:如果第一个匹配,则上面的第二个规则不会被处理,因为如果匹配该规则,[L]会导致mod_rewrite停止处理。