0

我正在尝试使用 mod_rewrite 在我的 .htaccess 文件中配置动态 mod 重写规则。我非常接近弄清楚这一点。我正在尝试获取这样的 URL:

http://www.mysite.com/index.php?service=14&title=events
http://www.mysite.com/index.php?service=48&title=planning

要自动重写为这些:

http://www.mysite.com/service/14/events
http://www.mysite.com/service/48/planning

到目前为止,这是我的代码:

RewriteRule ^service/(.*)/(.*)$ index.php?service=$1&title=$2 [NC,L]
RewriteCond %{QUERY_STRING} ^service=$1&title=$2 [NC]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index.php [NC]
RewriteRule ^index.php$ /service/$1/$2 [L,R=301]

我认为最后一行可能有问题?我不是最擅长正则表达式,所以任何帮助将不胜感激。编辑:只是想清楚漂亮的 URL 确实有效。但是,旧 URL 不会重定向,并且仍在浏览器中显示。

我不确定这是否会更容易,但如果我能让 URL 看起来像这样:

http://www.mysite.com/service/14/title/events
http://www.mysite.com/service/48/title/planning

那么这也行得通。我真的不需要将第二个查询标题放在 URL 中,但如果将其留在 URL 中更容易,那就没什么大不了的。

编辑:已回答非常感谢所有为解决方案做出贡献的人。我为我的重写规则得到了这个:

RewriteRule ^index/service/(.*)/(.*)/$ index.php?service=$1&title=$2

一旦我添加了“索引”,它就可以与两个查询字符串一起使用。就重定向而言,我编辑了我的 php 脚本并在那里进行了所有 URL 重定向,这要容易得多。特别感谢 mkjasinski 指出这一点。

4

2 回答 2

1

试试这个:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^service/([0-9]+?)?/([a-zA-Z\-]+?)$ index.php?service=$1&title=$2 [L,NC]

如果我已经运行:http://localhost/service/12/This-is-textin $_GETin index.php

array (size=2)
  'service' => string '12' (length=2)
  'title' => string 'This-is-text' (length=12)
于 2013-04-02T21:25:45.203 回答
0

您不能将以前重写规则中的特殊持有者($1,$2...)用于 rewritecond。

将您的代码更改为:

RewriteRule ^service/(.*)/(.*)$ index.php?service=$1&title=$2 [NC,L]

RewriteCond %{QUERY_STRING}  (?:^|&)service=([0-9]+)(&|$) [NC]
RewriteCond %{QUERY_STRING}  (?:^|&)title=([a-z]+)(&|$) [NC]   
RewriteRule ^index.php$ /service/%1/%3? [L,R=301]
于 2013-04-02T21:57:21.157 回答