我正在尝试使用以下 .htaccess 重写规则,但由于某种原因它不起作用。
RewriteEngine On
RewriteRule ^/([^/]+)/([^/]+)(.*) /index.php?_controller=$1&_action=$2$3 [QSA,L]
RewriteRule ^/([^/]+)(.*) /index.php?_controller=$1$2 [QSA,L]
我想要一个这样的 URL:
http://name.local/someFolder/?_controller=aController&_action=anAction
转换为:
http://name.local/someFolder/aController/anAction
我不确定为什么我的重写规则无法像我希望的那样工作,任何帮助都将不胜感激。谢谢!
答案1
可以像这样重写:
Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)$ index.php?_controller=$1&_action=$2 [QSA,L]
它将重写(内部重定向)/first/second
到 的请求/index.php?_controller=first&_action=second
。
仅当您请求不存在的资源时它才会起作用。因此,如果您有这样的文件夹/first/second
,则不会发生重写。
如果将模式从 更改^([^/]+)/([^/]+)$
为^([^/]+)/([^/]*)$
,那么它也将适用于此重写:/first/
(/index.php?_controller=first&_action=
请注意这里需要尾随斜杠)。
如果将模式从 更改^([^/]+)/([^/]+)$
为^([^/]+)/([^/]+)/?$
,则/first/second
和/first/second/
(一个带有尾随斜杠)都将触发规则。
如果将模式从 更改^([^/]+)/([^/]+)$
为^([^/]+)(/([^/]*))?$
,则此单个重写规则将匹配/first/second
以及 以及/first/
(/first
显然,如果不存在第二段,则操作参数_action=
将为空)。
还可以使带有 2 个段的尾部斜杠成为可选的(即/first/second
和/first/second/
将被视为相同(从重写的角度来看)。为此 - 将模式更改为^([^/]+)(/([^/]*))?/?$
。