2012-02-17 94 views
0

标题很模糊,所以我很抱歉。mod_rewrite,匹配特定模式

问题在于下面的代码。我需要在关键字语句后添加动作,但是我不希望动作在动作不存在时覆盖关键字。

与动作输入网址是http://websitenamehere/uk/en/meet-us/update 而不:http://websitenamehere/uk/en/meet-us

所以我想被触发的操作条款,只有当什么继续它是4个或更多字符的字符串。这个htaccess规则不应该取决于进行比较时所设置的国家或语言。

如果我错过了任何事情,请让我知道,我会更新问题。我知道这应该是相当简单的,但目前我只是在我走的时候通过htaccess和倾斜而失去知觉。

#language 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([a-z]{2})/([a-z]{2})(?:/(.*)|)$ /$1/$3?lang=$2 [NC,QSA,PT] 

#country 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([a-z]{2})(?:/(.*)|)$ /$2?country=$1 [NC,QSA,PT] 

#keyword 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([^/]+)/(.*)/$ /$2?keyword=$1 [NC,QSA,PT] 

#actions 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php !-f 
RewriteRule ^([^/]+)/(.*)$ /?action=$1 [NC,QSA,PT] 

#withoutactions 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php !-f 
RewriteRule ^([^/]+)/(.*)$ /$2?keyword=$1 [NC,QSA,PT] 

RewriteCond %{REQUEST_URI} !(\.[^./]+)$ 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.+)/$ /$1.php [NC,QSA,PT] 

回答

0

我今天想通了。基本上,当构建一个后向引用不止一次地通过规则时,htaccess文件发生了什么。

我添加了跳跃到原来的关键字行,但它只会被忽略:

#keyword 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([^/]+)/(.*)/$ /$2?keyword=$1 [NC,QSA,PT,S=1] 

#withoutactions 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php !-f 
RewriteRule ^([^/]+)/(.*)$ /$2?keyword=$1 [NC,QSA,PT] 

#actions 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php !-f 
RewriteRule ^([^/]+)/(.*)$ /?action=$1 [NC,QSA,PT] 

当htaccess的跑第二次在S将不再适用,那么它会击中withoutactions阻塞。为了避免这个,我只是检查是否关键字查询字符串已经存在,如果是这样跳过规则:

#keyword 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([^/]+)/(.*)/$ /$2?keyword=$1 [NC,QSA,PT,S=1] 

#withoutactions 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php !-f 
RewriteCond %{QUERY_STRING} !keyword 
RewriteRule ^([^/]+)/(.*)$ /$2?keyword=$1 [NC,QSA,PT] 

#actions 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php !-f 
RewriteRule ^([^/]+)/(.*)$ /?action=$1 [NC,QSA,PT] 

我希望这可以帮助别人遇到反向引用类似的问题!