Mod_Rewrite并发症

时间:2014-04-17 14:45:12

标签: php regex apache .htaccess mod-rewrite

我最近在我的网站上进行了大量的重新设计,其中一个变化是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中,然后将该名称用于数据库中的所有特定项目。同样的想法适用于标签,但拉出所有带有该标签的文章。我们的想法是让网址简洁明了。问题是,如果我像这样执行代码:

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值,无论变量名称还是正则表达式,都将忽略其余值。如果可能的话,我正在寻找一种格式化我的网址的方法。如果不是,我理解。我只是觉得问那些经验丰富的人并不痛苦。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

您可以遵守以下规则:

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]