gpt4 book ai didi

regex - MOD_REWRITE 用于 URL 变量,删除空参数并为第一个和第二个变量使用多个字段

转载 作者:行者123 更新时间:2023-12-01 04:11:34 25 4
gpt4 key购买 nike

我有一个以前的问题,回答得很好,但需要修改,我无法回答,所以创建了一个新问题。

我需要一个 mod_rewrite 来实现以下内容:

www.example.com?page=var1&cat=var2&subcat=var3&subsubcat=var4

进入这个:

www.example.com/var1/var2/var3/var4/

但这也涵盖了 var2、var3 和 var4 的可选使用,因此如果这些变量为空,它仍然可以工作。

这个问题回答得很好,但需要修改以使用 var2、var3 和 var4 的不同字段选项。

我的代码是:

RewriteEngine on
Options +FollowSymlinks -MultiViews

RewriteCond %{QUERY_STRING} !^page= [NC]
RewriteRule ^([^/]+)/?$ /?page=$1 [L]

RewriteCond %{QUERY_STRING} !^page= [NC]
RewriteRule ^([^/]+)/([^/]*)/?$ /?page=$1&cat=$2 [L]

RewriteCond %{QUERY_STRING} !^page= [NC]
RewriteRule ^([^/]+)/([^/]*)/([^/]*)/?$ /?page=$1&cat=$2&subcat=$3 [L]

RewriteCond %{QUERY_STRING} !^page= [NC]
RewriteRule ^([^/]+)/([^/]*)/([^/]*)/([^/]*)/?$ /?page=$1&cat=$2&subcat=$3&subsubcat=$4 [L]

这行得通,但我需要它能够做出 if-or-else 来选择将哪个字段用于哪个变量并区分差异。

例如,如果我们正常有以下两个字符串,很容易区分哪个字段对应哪个变量:

www.example.com?page=var1&cat=var2&subcat=var3&subsubcat=var4

www.example.com?othervar1=var1&othervar2=var2&othervar3=var3&othervar4=var4

但是对于这个字符串,它需要能够区分变量是针对哪个字段的:

www.example.com/var1/var2/var3/var4/

我需要 mod_rewrite 来选择正在使用的。

除此之外,当我实际转到一个确实存在的文件夹时,它确实可以正常工作。例如,如果我转到名为“test”的文件夹,这是一个实际文件夹:

www.example.com/test/

它将它用作“页面”字段的变量。如果我使用以下没有结束正斜杠的内容:

www.example.com/test 

它将以下内容输出到 URL 中:

www.example.com/test/?page=test

我需要它来处理正常存在的文件夹。

有人能告诉我这是怎么做到的吗?对于解决此问题的任何帮助,我将不胜感激。

此外,有人能告诉我开头的“-MultiViews”位是什么意思吗,因为我以前没有遇到过这个?

谢谢。

最佳答案

首先确定 MultiViews 选项:根据 Apache 手册:

MultiViews

Content negotiated "MultiViews" are allowed using mod_negotiation.

简而言之,如果您有一个名为 foo.html 的文件并且如果浏览器请求 http://example.com/foo 那么 Apache 会自动查找并附加扩展名并提供服务foo.html 到浏览器而不是抛出 404。这种行为会导致许多重写规则失败,因此我在回答您之前的问题时一开始就禁用了它。

现在要排除真实目录不被重写规则处理,我们需要一个像这样的附加条件:RewriteCond %{REQUEST_FILENAME} !-d

支持多种漂亮的 URL 方案:

您在这里几乎没有选择。请告诉我你想要哪一个,我会为此提供规则。

选项 1:在您的 URL 中同时包含 var namevar value,如下所示:

www.example.com/page/var1/cat/var2/subcat/var3/subsubcat/var4 或者
www.example.com/othervar1/var1/othervar2/var2/othervar3/var3/othervar4/var4

这个给你最大的灵 active ,如果你愿意走这条路,在重写规则中很容易处理。对于此选项,重写规则只需要编写一次,只要变量数量不变

,您就可以为将来的更改做好准备

选项 2:为每个方案设置不同的开始。例如:

www.example.com/handler1/var1/var2/var3/var4 或者
www.example.com/handler2/var1/var2/var3/var4

此选项为您提供更短的 URL,但不像之前的选项那样提供灵 active 。但是这个在Rewrite rules中也很容易处理。但是,对于此选项,需要为每个组合编写重写规则

所以我会推荐选项 1,如果您也喜欢这个选项,我很乐意为您准备一个 .htaccess。

选项 2 的 .htaccess 文件

Options +FollowSymlinks -MultiViews
RewriteEngine on

# 404 handler
ErrorDocument 404 /notFound.php

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^handler1/([^/]+)/?$ /?page=$1 [NC,QSA,L]
RewriteRule ^handler1/([^/]+)/([^/]+)/?$ /?page=$1&cat=$2 [NC,QSA,L]
RewriteRule ^handler1/([^/]+)/([^/]*)/([^/]*)/?$ /?page=$1&cat=$2&subcat=$3 [NC,QSA,L]
RewriteRule ^handler1/([^/]+)/([^/]*)/([^/]*)/([^/]*)/?$ /?page=$1&cat=$2&subcat=$3subsubcat=$4 [NC,QSA,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^handler2/([^/]+)/?$ /?othervar1=$1 [NC,QSA,L]
RewriteRule ^handler2/([^/]+)/([^/]+)/?$ /?othervar1=$1&othervar2=$2 [NC,QSA,L]
RewriteRule ^handler2/([^/]+)/([^/]*)/([^/]*)/?$ /?othervar1=$1&othervar2=$2&othervar3=$3 [NC,QSA,L]
RewriteRule ^handler2/([^/]+)/([^/]*)/([^/]*)/([^/]*)/?$ /?othervar1=$1&othervar2=$2&othervar3=$3othervar4=$4 [NC,QSA,L]


选项 1 的 .htaccess 文件

Options +FollowSymlinks -MultiViews
RewriteEngine on

# 404 handler
ErrorDocument 404 /notFound.php

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)(/.*)?$ $3?$1=$2 [N,QSA,DPI]
RewriteRule ^(/[^/]+|[^/]+/|/?)$ /index.php [L,QSA,DPI]

使用这些规则,http://localhost/n1/v1/n2/v2/n3/v3/n4/v4 的 URL 将被内部重定向到 http://localhost/?n4=v4&n3=v3&n2=v2&n1=v1 将每对由 / 分隔的 URL 段视为 QUERY_STRING 的 name-value 对。 但是请记住,如果 URI 没有偶数个段,例如:http://localhost/n1/v1/n2/ 那么它将被重定向到 http://localhost/?n1=v1,丢弃多余的 n2。

关于regex - MOD_REWRITE 用于 URL 变量,删除空参数并为第一个和第二个变量使用多个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5776208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com