0

我正在使用 MVC 和 /<module>/<controller>/<action>/ 在 example.com/module/whatever 有一个模块,我需要将它“重命名”为 example.com/module-a/whatever。整个应用程序已经编写好了,所以我无法在我的代码中到处更改它,所以我希望使用 mod_rewrite 来完成。我试过以下

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

就将 example.com/module/whatever 之类的所有 url 重定向到 example.com/module-a/whatever 而言,这做了我想要的,但现在我需要将“module-a”中的所有请求在内部重写为“module” . 它还需要适用于模块根目录(即 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 似乎做了一些覆盖它的东西,所以我不得不用路由来处理它。请参阅使用路由重命名 zend 模块

4

1 回答 1

0

如果我理解正确,那么您从错误的方向着手。我也不清楚你的 RewriteCond 的目的

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

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

我怀疑您遇到的问题是网站上的内部链接都引用 /module/ 而不是 /module-a/,但是放置 301 将导致问题无止境(尤其是搜索引擎),并且随后重写你可能会陷入循环引用。您最好更改应用程序中的链接代码(如果您有链接抽象类),或者在最坏的情况下使用输出缓冲在呈现页面之前交换所有链接。

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

于 2012-05-18T18:41:58.497 回答