删除参数的PHP.htaccess.PHP扩展名和语言目录
我正在为PHP服务器中的删除参数的PHP.htaccess.PHP扩展名和语言目录,php,regex,.htaccess,Php,Regex,.htaccess,我正在为PHP服务器中的.htaccess文件寻找一个正则表达式 我想要的是,它将第一个目录中的语言检测为参数: nl 嗯 是 德 任何其他选项都必须视为目录或文件名。语言必须作为参数提供,而不会损坏任何其他参数 另外,我希望最后一个/替换为.php 一些例子: host.com/nl/index/ -> host.com/index.php?lang=nl host.com/de/test/abc/ -> host.com/test/abc.php?lang=de host.c
.htaccess
文件寻找一个正则表达式
我想要的是,它将第一个目录中的语言检测为参数:
- nl
- 嗯
- 是
- 德
/
替换为.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>
重新启动发动机
重写cond%{REQUEST_FILENAME}-F
RewriteCond%{REQUEST_FILENAME}.php-f
重写规则>>>请求的表达式并替换模式尝试以下操作
RewriteRule ^([a-z]{2})/(.+)/?$ /$2.php?lang=$1 [QSA]
试试这个
RewriteRule ^([a-z]{2})/(.+)/?$ /$2.php?lang=$1 [QSA]
通过httpd.conf
启用mod_rewrite和.htaccess,然后将此代码放入文档根目录下的.htaccess
:
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]
通过httpd.conf
启用mod_rewrite和.htaccess,然后将此代码放入文档根目录下的.htaccess
:
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]
通过一次考虑一个片段,正则表达式最容易解释。我们来分析一下:
^
-URL的开始
/
-匹配第一个斜杠
([a-z]{2})
-匹配并捕获2个字母(进入$1
变量)
(
-开始捕获组(进入$2
)
/
-匹配斜杠
+
-匹配零个或多个字符
)
-结束捕获组($2
)
/?
-匹配“文件路径”的可选结束斜杠(但不捕获它)
$
-URL结束
因此,您捕获了两件事:
1。语言(捕获组$1
):
2。文件路径,以斜杠开始(捕获组$2
),后跟可选斜杠:
(/.+)/?
最后,末尾的QSA
标志将原始查询字符串(如果有)附加到重写的URL。如果您想使正则表达式匹配不区分大小写(即允许像host.com/NL/index/
这样的URL),您也可以添加NC
标志:[QSA,NC]
。或者,您可以在正则表达式中使用[A-Za-z]
而不是[A-z]
来显式允许大写字母
通过一次考虑一个片段,正则表达式最容易解释。我们来分析一下:
^
-URL的开始
/
-匹配第一个斜杠
([a-z]{2})
-匹配并捕获2个字母(进入$1
变量)
(
-开始捕获组(进入$2
)
/
-匹配斜杠
+
-匹配零个或多个字符
)
-结束捕获组($2
)
/?
-匹配“文件路径”的可选结束斜杠(但不捕获它)
$
-URL结束
因此,您捕获了两件事:
1。语言(捕获组$1
):
2。文件路径,以斜杠开始(捕获组$2
),后跟可选斜杠:
(/.+)/?
最后,末尾的QSA
标志将原始查询字符串(如果有)附加到重写的URL。如果您想使正则表达式匹配不区分大小写(即允许像host.com/NL/index/
这样的URL),您也可以添加NC
标志:[QSA,NC]
。或者,您可以通过在正则表达式中使用[A-Za-z]
而不是[A-z]
来显式允许大写字母。语言目录(nl等)确实存在吗?@Ravi目前还不错。但我想把它们处理掉。如果你的意思是,如果存在任何名为nl、de、be或en的目录,我会阻止它,特别是在需要的时候。语言目录(nl等)真的存在吗?@Ravi,好吧,现在。但我想把它们处理掉。如果你的意思是,如果存在任何名为nl、de、be或en的目录,我会阻止它,特别是在需要的时候。谢谢你给出的清晰有效的答案。我基本上已经理解了正则表达式,但是这个对我来说有点太难了,因为我不知道它如何与.htaccess脚本协同工作。你能告诉我它使用哪种正则表达式吗?此外,我的索引文件将不再工作。它也不明白为什么这是与多个目录工作。(/。+)
是否为
捕获多个/
?我觉得很奇怪,把他们分开想想。/
与
无关<代码>/
与斜杠匹配<代码>
匹配“任何字符”<代码>+
表示“一个或多个上一个”。因此,/.+
匹配一个斜杠,后跟一个或多个字符(任意字符)。这意味着它将匹配/hello
或/hello/
或/hello/how/are/you
或甚至匹配/hello$”()/无论什么/
。如果希望使该规则更具限制性,而不是使用
,则可以使用[\w/]
,它匹配任何单词字符或斜杠。所以/[\w/]+
将匹配/hello
和/hello/how
和/hello/how/are/
但不匹配/hello/hfo$”()/
@sgroves谢谢,这部分听起来很简单。但是它如何能够匹配最后一个/
,而它应该已经被
匹配了?@Tim简短回答:这就是正则表达式引擎的工作方式。因为我明确地告诉正则表达式在+
之后匹配/
,所以+
不会匹配字符串中的最后一个/
。会,,