PHP.htaccess删除参数的.PHP扩展名和语言目录


PHP .htaccess removing .php extension and language directory to parameter

我正在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,然后将此代码放在.htaccessDOCUMENT_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]