0

我仍然没有答案,所以我在这里发布。

我想以root/language/sub/.../document.htaccess 文件的形式匹配一个 url,然后将其重写为root/sub/.../document.php?lang=language

我接近命中,但似乎我的正则表达式没有“捕捉”输入网址。这里是 :

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond ^[a-z]{2}.*$/%{REQUEST_FILENAME}\.php -f
RewriteRule ^([a-z]{2})/(.*)$ $2.php?lang=$1

有人可以指出我这里有什么问题吗?我不是正则表达式或 apache 重写方面的专家。

特维姆

* 编辑 *

root代表域即mydomain.net

这里有一些例子 :

mydomain.net/fr/contact

应该重写为

mydomain.net/contact.php?lang=fr

mydomain.net/en/articles/view

应该重写

mydomain.net/articles/view.php?lang=en

ETC...

4

3 回答 3

1

我相信您正在寻找这种配置:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} ^(.*/|)(en|de|fr)/(.*)$ [NC]
RewriteCond %1%3.php -f
RewriteRule ^(.*/|)(en|de|fr)/(.*)$ $1$3.php?lang=$2 [NC,QSA,L]

解释:

RewriteCond %{REQUEST_FILENAME} !-d

检查请求的 url 是否不是目录。如果是,则不处理任何重写。

RewriteCond %{REQUEST_FILENAME} ^(.*/|)(en|de|fr)/(.*)$ [NC]

检查 url 是否包含内部/xx/部分,其中xxoneen或. 标志允许大写和小写字符,因此例如或将被接受。如果 url 中没有这样的“语言”部分,则不会处理重写。defr[NC]ENFr

RewriteCond %1%3.php -f

检查%1%3.php文件是否存在,其中%1is(.*/|)%3is(.*)与之前的 RewriteCond 匹配^(.*/|)(en|de|fr)/(.*)$。如果这样的 php 文件不存在,则不会进行重写。

RewriteRule ^(.*/|)(en|de|fr)/(.*)$ $1$3.php?lang=$2 [NC,QSA,L]

RewriteRule中的left条件如果到了这一行就会匹配,因为它已经用RewriteCond检查过了,所以现在它会处理重写到php文件,添加lang部分,但是因为还有[QSA]flag,它也会保留其他GET参数,因此lang将添加到现有参数中。Flag[L]说这是最后一个应该应用的重写规则,并且不会再用这个 url 处理重写。

于 2012-09-08T14:57:50.113 回答
0

好吧,我不确定 root 在那里做什么,你试过了吗

RewriteRule ^root/([a-z]{2})/(.*)$ root/$2.php?lang=$1
于 2012-09-08T00:45:10.393 回答
0

有什么问题是第二个RewriteCond。但是你的问题很模糊。如果您的意思是您正在尝试转换

root/foo/sub/.../something.php

root/sub/.../something.php?lang=foo

然后开始坐立不安:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^root/([^/]+)/sub/(.*)/%{REQUEST_FILENAME}$ root/sub/$2/%{REQUEST_FILENAME}?lang=$1
于 2012-09-08T04:45:28.300 回答