Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除参数的PHP.htaccess.PHP扩展名和语言目录_Php_Regex_.htaccess - Fatal编程技术网

删除参数的PHP.htaccess.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

我正在为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.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简短回答:这就是正则表达式引擎的工作方式。因为我明确地告诉正则表达式在
+
之后匹配
/
,所以
+
不会匹配字符串中的最后一个
/
。会,,