【问题标题】:Mod_Rewrite ComplicationsMod_Rewrite 并发症
【发布时间】:2014-04-17 14:45:12
【问题描述】:

我最近对我的网站进行了很多重新设计,其中一项更改是 SEO URL,我正在做 Mod_Rewrite 来做到这一点。问题是我根本不完全熟悉 reg 表达式,在使用 .htaccess 文件时我也不是世界上最好的。现在,我遇到的问题是我有几个变量相同的级别和我正在使用的 RewriteRules 正在相互抵消。我确实通过将标签、名称和页面添加到重写的 url 中找到了解决方法,但这不是我想要的。我希望将网址结构化,使其为 /$lg/articles/[$tag|$name|$page]/ 再次,这样做是我想要的方式导致它们发生冲突,因为文档似乎不知道同时读取和处理三个。有关如何执行此操作的任何提示和建议?我将不胜感激。 :D

RewriteRule ^([^/]*)/articles/tag/([^/]*)$ /articles.php?lg=$1&tag=$2
RewriteRule ^([^/]*)/articles/name/([a-zA-Z]+)$ /articles.php?lg=$1&name=$2
RewriteRule ^([^/]*)/articles/page/([0-9]+)$ /articles.php?lg=$1&page=$2

我想要的是这样的 URL 结构:/language/articles/Variable Value。假设输入了一个整数,我希望 url 看起来像这样:/en/articles/1,然后它将作为分页系统的页码。或者将文章名称放入:/en/articles/random_article_name,然后该名称将用于数据库中的所有特定文章。同样的想法也适用于标签,但会提取所有带有该标签的文章。这个想法是让 URL 简短而干净。问题是,如果我这样做代码:

RewriteRule ^([^/]*)/articles/([^/]*)$ /articles.php?lg=$1&tag=$2
RewriteRule ^([^/]*)/articles/([a-zA-Z]+)$ /articles.php?lg=$1&name=$2
RewriteRule ^([^/]*)/articles//([0-9]+)$ /articles.php?lg=$1&page=$2

将只读取 $_GET 值中的一个,而不管变量名称或正则表达式如何,其余的都将被忽略。如果可能的话,我正在寻找一种像这样格式化我的网址的方法。如果不是,我理解。我只是觉得问那些更有经验的人并没有什么坏处。

【问题讨论】:

  • 提供一些您想要在浏览器中使用的 URL 示例以及它们应该在内部重写的内容?
  • 我刚刚在第一个答案的 cmets 中提供了这个,但我将编辑原始帖子以提供示例。

标签: php regex apache .htaccess mod-rewrite


【解决方案1】:

你可以有这样的规则:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]

RewriteRule ^([^/]*)/articles/([0-9]+)/?$ /articles.php?lg=$1&page=$2 [L,QSA]

RewriteRule ^([^/]*)/articles/([a-zA-Z]+)/?$ /articles.php?lg=$1&name=$2 [L,QSA]

【讨论】:

    【解决方案2】:

    我不确定什么不起作用,因为您的规则对我来说似乎很好。你可以试试这个来分组 3 条规则:

    RewriteRule ^([^/]*)/articles/(page|name|tag)/([0-9]+)$ articles.php?lg=$1&$2=$3
    

    【讨论】:

    • 问题是我不想要 url 中的页面、名称或标签文本,我只想要变量。 /articles.php?lg=$1&page=$2, /articles.php?lg=$1&name=$2, /articles.php?lg=$1&tag=$2 都是单独的 $_GET 变量,但系统选择一个并忽略休息,好像我一次只能处理一个。我试过你的代码,如果我删除它就会中断 (page|name|tag)/
    • 好吧,我没明白你的意思。您是什么意思“我不希望 url 中的页面、名称或标签文本”? URL中必须有这样的文本才能知道它是页面、名称还是标签。
    • 我的意思是,如果你看一下这段代码:^([^/]*)/articles/([^/]*)$ /articles.php?lg=$1&tag= $2,它仍然会处理,但 url 会显示 /en/articles/*random tag name*,或 ^([^/]*)/articles/([^/]*)$ /articles.php?lg=$1 &page=$2 并且它有一个类似 /en/articles/1 等的 url。我知道它必须在原始使用中查找 $_GET 值,page|name|tag,问题是检查重写的 url试图匹配它,但由于“模板”相同,所以无法弄清楚它是哪一个。
    • 我正在寻找一种使模板相同的方法,但变量名称不同。如果不可能,那很好,但我认为问它永远不会有坏处。
    • 告诉我们您的网址是什么样的,以及应该重写的地方。