我正在PHP服务器中为.htaccess
文件寻找一个正则表达式。
我想要的是它检测第一个目录中的语言作为参数:
- nl
- en
- be
- de
任何其他选项都必须被视为目录或文件名。必须在不损坏任何其他参数的情况下将语言作为参数给定。
另外,我希望最后一个/
被.php
取代。
一些例子:
host.com/nl/index/ -> host.com/index.php?lang=nl
host.com/de/test/abc/ -> host.com/test/abc.php?lang=de
host.com/be/a/b/c/?t=23 -> host.com/a/b/c.php?lang=be&t=23
这可能吗?我不能让它工作,我希望有人能帮我!
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule >>> requested expression and replacing pattern <<<
</IfModule>
RewriteRule ^/([a-z]{2})(/.+)/?$ $2.php?lang=$1 [QSA]
Regexes最容易通过一次考虑一个片段来解释。让我们来分解一下:
^
-URL的开头/
-匹配第一个斜线([a-z]{2})
-匹配并捕获2个字母(进入$1
变量)(
-开始捕获组(进入$2
)/
-匹配斜线.+
-匹配零个或多个字符)
-端捕获组($2
)/?
-匹配"文件路径"的可选结束斜线(但不要捕获它)$
-URL结尾
所以,你捕获了两件事:
1。语言(捕获组$1
):
([a-z]{2})
2。文件路径,以斜线开头(捕获组$2
),后跟可选斜线:
(/.+)/?
最后,末尾的QSA
标志将原始查询字符串(如果有的话)附加到重写的URL中。如果您想使正则表达式匹配不区分大小写(即允许类似host.com/NL/index/
的URL),也可以添加NC
标志:[QSA,NC]
。或者,您可以在正则表达式中使用[A-Za-z]
而不是[a-z]
来显式地允许使用大写字母。
通过httpd.conf
启用mod_rewrite和.htaccess,然后将此代码放在.htaccess
的DOCUMENT_ROOT
目录下:
Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$2.php -f
RewriteRule ^([a-z]{2})/(.+?)/?$ /$2.php?lang=$1 [L,QSA,NC]
试试这个
RewriteRule ^([a-z]{2})/(.+)/?$ /$2.php?lang=$1 [QSA]