【问题标题】:Htaccess URL rewrite domain with wildcard使用通配符的 Htaccess URL 重写域
【发布时间】:2012-01-18 07:39:22
【问题描述】:

我正在使用 htaccess 来管理友好的网址

我的友好网址如下所示:
www.example.com/p/12345/John-Smith

12345 是 ID 号,/p/ 不变,名称是无关的友好 url。我的背景网址如下所示:
www.example.com/page.php?id=12345

我的 htaccess 看起来像这样:

Options +FollowSymlinks
RewriteEngine on

RewriteRule (.*) http://www.example.com/$1 [R=301,L]
RewriteRule ^p/([0-9]+)/([^/\.]+)?$ details.php?id=$1 [L]

一切都像魅力一样。

但是,我真正希望我的 htaccess 如下所示。唯一不同的是 ^(.*)/p/ 与 ^p。

Options +FollowSymlinks
RewriteEngine on

RewriteRule (.*) http://www.example.com/$1 [R=301,L]
RewriteRule ^(.*)/p/([0-9]+)/([^/\.]+)?$ page.php?id=$1 [L]

基本上,我想确保只有 url 中的 /p/ 目录触发这个特定的 htaccess 规则,而不是意外的东西,比如 example.com/gdp/12345/abc

对于我的一生,我无法弄清楚为什么这不起作用!

一如既往地提前致谢。

【问题讨论】:

  • 第一条规则重写 yoururl.tld/p/1234/Name,第二条规则重写如下:yoururl.tld/Something/p/1234/Name 但不是 yoururl.tld/Somethingp/1234/名称..所以这正是您所描述的。如果我误会了,请告诉我?
  • ^ 表示网址的开头。所以p/...前面什么都不允许。所以example.com/gdp/12345/abc 永远不会匹配第一条规则。试试看。您的统治已经完全按照您的意愿行事。

标签: apache .htaccess


【解决方案1】:

您的规则RewriteRule ^(.*)/p/([0-9]+)/([^/\.]+)?$ page.php?id=$1 [L] 有一些问题。

  1. 您没有反向引用正确的 id:第一个 ( ) 匹配 /p/ 之前的内容,因此 $1 将反向引用它,而不是 id。
  2. URI 在它们存在时通过了重写规则,并且 .htaccess 文件的前导 / 被剥离,因此正则表达式 ^(.*)/p/永远匹配 http://www.example.com/p/1234 之类的东西,因为正在被传递给规则的是p/1234
  3. 您的规则中的另一个奇怪之处是您将所有内容重定向到 http://www.example.com/,这似乎是一个重定向循环,但如果这对您有用,那就没问题了。

要处理 1 和 2,您需要将反向引用更改为 $2 和您的正则表达式以容纳 p/1234 URI:

RewriteRule (^|/)p/([0-9]+)/([^/\.]+)?$ page.php?id=$2 [L]

(^|/) 表示它是 URI 的开头(对于 p/1234)或者是斜杠(对于 /something/p/1234)。

【讨论】:

  • 谢谢乔恩。你说得对,因为我忘了把 1 美元改成 2 美元,所以没有开始。直到 (^|/)/ 被编辑之前,它仍然没有解决,我永远也想不通。非常感谢!
猜你喜欢
  • 2017-05-09
  • 1970-01-01
  • 2022-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多