Htaccess URL使用通配符重写域

时间:2012-01-18 07:39:23

标签: apache .htaccess

我正在使用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

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

一如既往地感谢您。

1 个答案:

答案 0 :(得分:0)

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

  1. 您没有反向引用正确的ID:第一个()匹配/p/之前的内容,因此$ 1将反向引用该内容,而不是ID。
  2. URI在它们进入时通过重写规则且.htaccess文件具有前导/剥离,因此正则表达式^(.*)/p/ 永远不会匹配http://www.example.com/p/1234之类的内容,因为传递给规则的URI是p/1234
  3. 你的规则中另一个奇怪的事情是你将所有内容重定向到http://www.example.com/,这似乎是一个重定向循环,但如果这对你有效,那就没关系。
  4. 要处理1和2,您需要将反向引用更改为 $ 2 ,并使用正则表达式来容纳p/1234 URI:

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

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