Mod rewrite htaccess - 重写规则中的两个变量

4

我在网上找到了这个解决方案:

RewriteEngine On
RewriteBase /test/

RewriteRule ^([^-]*)/$ index.php?page=$1
RewriteRule ^([^-]*)/([^-]*)/$ index.php?page=$1&link=$2 [L]

#dodaje slash na koncu
RewriteRule ^(([a-z0-9\-]+/)*[a-z0-9\-]+)$ $1/ [NC,R=301,L]

第一个 RewriteRule 很完美地工作了,它返回了 $_GET['page']=130。但是当涉及到第二个 RewriteRule 时,它返回给我的是 $_GET['page']=index.php 而不是 $_GET['page']=130$_GET['link']=35。这会导致 SQL 错误,因为页面的数字 ID 是必须的。
正常链接看起来像: ?page=136 ?page=136&link=35 重写后的链接: /136/ - 正常工作 /136/35/ - 不正常工作,$_GET['page']=index.php

你要访问的URL是什么?请明确说明。 - Justin Iurman
link <- 不进行重写 link <- 进行重写,无法正常工作 - RaV
你是想访问 /130/35 还是 /130/35/?因为你的规则只有在有尾随斜杠时才匹配。 - Justin Iurman
不,RewriteRule ^(([a-z0-9\-]+/)*[a-z0-9\-]+)$ $1/ [NC,R=301,L] 会在结尾添加斜杠。 - RaV
1个回答

3
您可以使用以下代码替换您当前的代码(您的htaccess文件必须位于“test”文件夹中,同样适用于“index.php”):
RewriteEngine On
RewriteBase /test/

# add trailing slash if no trailing slash and not an existing file/folder
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+[^/])$ $1/ [R=301,L]

RewriteRule ^([^/]*)/([^/]*)/$ index.php?page=$1&link=$2 [L]
RewriteRule ^([^/]*)/$ index.php?page=$1 [L]

您可以尝试以下链接:
  • http://domain.com/test/136/35/ 内部重写为 index.php?page=136&link=35
  • http://domain.com/test/136/35 重定向到 http://domain.com/test/136/35/
  • http://domain.com/test/136/ 内部重写为 index.php?page=136
  • http://domain.com/test/136 重定向到 http://domain.com/test/136/

请注意,这些链接涉及IT技术相关内容。

谢谢,太棒了。这完美地解决了问题。都是关于重写顺序的问题吗? - RaV
你的代码中有很多错误。我已经重新编写了你的尾部斜杠规则,并且还修改了两个规则中的模式(在这段代码中顺序并不重要)。 - Justin Iurman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接