.htaccess 可以使用 3 个相同的参数吗?

Posted

技术标签:

【中文标题】.htaccess 可以使用 3 个相同的参数吗?【英文标题】:Are 3 identical parameters possible with .htaccess? 【发布时间】:2021-08-20 06:00:06 【问题描述】: 到目前为止,

@anubhava@RavinderSingh13 极大地帮助了我了解有关 .htaccess 和重写规则的更多信息。但是,即使第一条规则(带有一个参数:$id)和第二条规则(带有两个参数:$id$name >) 用于重写 url,我尝试使用两个参数($id$class)的第三条规则失败,并且不会重写最终 url。以下是我到目前为止的整个文件。我想补充一下,$class参数的格式是a-classb-class等,所以也许是这样可能是重写不起作用的贡献者?感谢您帮助我继续学习至今!

RewriteEngine on
--1st rule with one parameter: $id--
RewriteCond %ENV:REDIRECT_STATUS ^$
RewriteCond %QUERY_STRING id=([0-9]+) [NC]
RewriteRule ^file\.php$ /directory/%1? [R=301,L,NC]
RewriteRule ^directory/(\d+)/?$ /directory/file.php?id=$1 [L,QSA,NC]

--2nd rule with two parameters: $id and $name--
RewriteEngine on
RewriteCond %THE_REQUEST \s/file\.php\?id=(\d+)&name=(\S+)\s [NC]
RewriteRule ^ /directory/%1/%2? [R=301,L]
RewriteRule ^directory/(\d+)/(.*)/?$ /directory/file.php?id=$1&name=$2 [NC,L,QSA]

--My attempt at the third rule following the example from the second, but this rule fails. Parameters are $id and $class--
RewriteEngine on
RewriteCond %THE_REQUEST \s/file\.php\?id=(\d+)&class=(\S+)\s [NC]
RewriteRule ^ /directory/%1/%2? [R=301,L]
RewriteRule ^directory/(\d+)/(.*)/?$ /directory/file.php?id=$1&class=$2 [NC,L,QSA]

【问题讨论】:

感谢您在问题中分享您的努力(继续),当您现在点击课程网址时发生了什么? 您有两个具有相同模式的规则。引擎只会为第一个提供服务。 我刚刚在我的页面上返回了一堆未定义的变量。但是,变量本身不是问题,因为当我在没有 url 重写的情况下访问它时,带有 class 和 id 参数的页面可以正常工作。我还要补充一点,我正在尝试以这种格式重写 url,类似于其他 url:ipaddress/directory/47/s-class 在这种情况下,47 是 id 参数和 s-classclass 参数。 【参考方案1】:

使用您显示的示例并考虑类词将始终存在于您的第三个网址中,请尝试以下规则。另外你不需要多次写RewriteEngine ON,文件启动1次就足够了。

RewriteEngine on
##1st rule with one parameter: $id--
RewriteCond %ENV:REDIRECT_STATUS ^$
RewriteCond %QUERY_STRING id=([0-9]+) [NC]
RewriteRule ^file\.php$ /directory/%1? [R=301,L,NC]
RewriteRule ^directory/(\d+)/?$ /directory/file.php?id=$1 [L,QSA,NC]

##Parameters are $id and $class
RewriteCond %THE_REQUEST \s/file\.php\?id=(\d+)&class=(\w+-class)\s [NC]
RewriteRule ^ /directory/%1/%2? [R=301,L]
RewriteRule ^directory/(\d+)/(\w+-class)/?$ /directory/file.php?id=$1&class=$2 [NC,L,QSA]


##Rule with two parameters: $id and $name--
RewriteCond %THE_REQUEST \s/file\.php\?id=(\d+)&name=(\S+)\s [NC]
RewriteRule ^ /directory/%1/%2? [R=301,L]
RewriteRule ^directory/(\d+)/(.*)/?$ /directory/file.php?id=$1&name=$2 [NC,L,QSA]

【讨论】:

感谢您的解决方案,因为现在 url 成功重定向,没有未定义的变量。但是,现在 $class 过滤器将无法正常工作。相反,它只会正常显示所有数据,而不应用 $class 过滤器。例如,通常,此 URL 将过滤该数据:IPAddress/directory/file.php?id=47&class=s。这表明 $class 过滤器现在只使用原始 url 而不是重写。现在想来,是不是原来的url只显示s$class而不是s-class?跨度> @ccc,如果您执行了我发布的确切规则,请告诉我(我在发布后 1 分钟后通过更改它们的顺序对其进行了编辑),请确认一次。 是的,当我在研究你的原始答案时,我看到你交换了第二条和第三条规则的顺序,所以我也交换了它们。 啊,是的!这现在有效!我只需要通过在数组中创建$class 变量s-class 而不是s 来解决我的问题。感谢您的帮助! @ccc,欢迎您的欢呼和快乐的学习,继续在这个伟大的论坛上分享很好的问答,干杯。

以上是关于.htaccess 可以使用 3 个相同的参数吗?的主要内容,如果未能解决你的问题,请参考以下文章

htaccess 301 重定向新基础域名的通配符

简单的 .htaccess 重写以传递 1 个参数

htaccess 301重定向通配符以获取新的基本域名

java问题:请问同一个类中可以有2个名字相同的函数吗?为啥啊?

主机上通常有 include_path/htaccess 限制吗?

可以使用 .htaccess 和特定的 GET 请求(Dropbox 样式)强制下载吗?