2013-10-08 144 views
2

我已经开发了一个小的(和强大的轻便:-D)PHP MVC框架路由和SEFURL用的.htaccess

我目前遇到的问题是: 路线遵循此顺序

的index.php?选择= samplemodule &行动= sampleController

为ZF用来做前一阵子那将链接到samplemodule和将执行sampleController,漂亮多了。

我试图获得的.htaccess重写规则 /模块/动作

但由于某种原因它不工作,这里的一块代码

RewriteEngine On # Turn on the rewriting engine 
RewriteCond %{SCRIPT_FILENAME} -f 
RewriteRule^- [L] 
RewriteRule  ^[A-Za-z0-9-]+/([A-Za-z0-9-]+)/?$ index.php?option=$1&action=$2 [NC,L] 
RewriteRule  ^[A-Za-z0-9-]+/([A-Za-z0-9-]+)?$ index.php?option=$1&action=$2 [NC,L] 
RewriteRule  ^([A-Za-z0-9-]+)/?$ index.php?option=$1&action=main [NC,L] 
RewriteRule  ^([A-Za-z0-9-]+)?$ index.php?option=$1&action=main [NC,L] 

与处理的正则表达式是相当困难的

我也喜欢它,传递变量时,这些可能是 /模块/动作/ VAR1/VALUE1形式/ VAR2 /值2

但我不确定重写模式引擎是如何工作的......它是否递归地使用多个规则?

回答

1

它是否递归使用多个规则?

它的确如此,但并不像听起来那么简单。

至于URL模式,可以无限期继续下去,如:/模块/动作/ VAR1/VALUE1/VAR2 /值2

你可以尝试这样的事:

# turn everything after /module/action/XXXX to query string variables 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([^/]+)/([^/]+)(.*)$ /$1/$2/$5?$3=$4 [L,QSA] 

# turn /module/action/ into option= and action= 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?option=$1&action=$2 [L,QSA] 

# turn /module/ into option= and action=main 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([A-Za-z0-9-]+)/?$ index.php?option=$1&action=main [L,QSA] 
+0

是啊,这应该工作,正则表达式真棒,谢谢,但... –

+0

它不工作大声笑。所以如果你把L引用结尾,它会把它作为最后的规则,它不会继续分析。问题是...我该怎么做才能保持重写? 。所以我们可以说我有以下字符串 var1/a/var2/b/var3/c/var4/d/var5/d/var6/f 程序将匹配第一个var1/a/var2/a,然后剩下的/ var3/c/var4/d ....为其他两个不匹配的规则:S –