我正在使用 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 模块