【问题标题】:MOD_REWRITE for URL variables, removing empty parameters and using more than 1field for the first and second variablesMOD_REWRITE 用于 URL 变量,删除空参数并为第一个和第二个变量使用多个字段
【发布时间】:2011-04-28 21:29:42
【问题描述】:

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

我需要一个 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”位是什么意思,因为我以前没有遇到过这个?

谢谢。

【问题讨论】:

  • 如果您希望能够省略 cat 但仍然有两个 subcats,则需要一个类似 www.example.com/value1/cat/value2/subcat/value3/subcat/value4/ 的 URL 结构。与其他变量类似。还是我错过了什么?

标签: regex apache .htaccess mod-rewrite clean-urls


【解决方案1】:

首先确定 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: 在您的网址中同时包含 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

如果你愿意走这条路,这个给你最大的灵活性并且在重写规则中很容易处理。对于此选项,只需编写一次重写规则,只要变量数量不变,您就可以应对未来的变化

选项 2:开始对每个方案有所不同。例如:

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

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

所以我会推荐选项 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]


.htaccess 文件用于选项 1

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。

【讨论】:

  • @anubhava。感谢你的回复。我更愿意将选项 2 用于我当前的项目,但我确信我和许多其他人在未来阅读也需要选项 1。如果您可以为我提供选项 2,如果可以,请为其他观众提供选项 1,我可以自己在另一个项目中使用它。另外,我认为“Options +FollowSymlinks -MultiViews”在“RewriteEngine on”之前。它总是追求还是只针对这个版本?感谢您的所有帮助。
  • 我相信 Options +FollowSymlinks -MultiViews 可以在 RewriteEngine on 之前或之后。好的,我会在短时间内为您提供这两个选项的 .htaccess 规则。
  • @anubhava。请确保如果发生错误,例如 404,它仍然能够转到定向页面,例如错误文档 404 /404.php。再次感谢您。
  • 抱歉赶上了一些紧急工作。我已经为上面的选项 2 提供了 .htaccess。请尝试并告诉我。今晚我还将为您提供选项 1 的 .htaccess 规则。
  • @anubhava。我对这个网站很陌生。您将在哪里放置新的 .htaccess 代码?你会修改上面的答案还是会去其他地方?谢谢。
猜你喜欢
  • 2013-02-17
  • 2011-10-12
  • 1970-01-01
  • 2011-08-12
  • 1970-01-01
  • 2021-12-17
  • 2011-12-07
  • 2015-10-19
  • 2019-09-08
相关资源
最近更新 更多