创建简单的.htaccess URL重写

时间:2014-01-16 11:11:04

标签: regex apache .htaccess mod-rewrite

我在托管的Apache服务器上的.htaccess中进行简单的重写时遇到了困难。

我读过的所有教程都使用正则表达式来使复杂的URL更加用户友好,特别是动态创建的URL。

一个例子: RewriteRule ^product/([^/.]+)/?$ product.php?id=$1 [L] 会改变 www.yoursite.com/product.php?id=123www.yoursite.com/product/123

然而,这并不像我想的那样方便用户使用。在使用动态网址的网站中,我想更改 /index.php?main_page=product_info&cPath=0&products_id=97http://www.example.com/product-name-a

所以,我试过了:

Options +FollowSymLinks
RewriteEngine On
RewriteRule   /index.php?main_page=product_info&cPath=0&products_id=97   http://www.example.com/product-name-a
RewriteRule   /index.php?main_page=product_info&cPath=0&products_id=98   http://www.example.com/product-name-b
RewriteRule   /index.php?main_page=product_info&cPath=0&products_id=99   http://www.example.com/product-name-c

不会产生任何错误,但它不起作用。

这可能吗?如果是这样,我的语法不好吗?如果不可能,有人可以建议重写(不重定向)个别网址的方法吗?

我知道不使用正则表达式意味着更多的手工工作。我准备好了。这个数据来自一个文本文件,我将创建它。我不是在询问数据库访问或与数据来源有关的任何内容。

我不认为这是一个重复的问题:

  • 其他问题涉及重写或重定向部分内容,而不是 完整的网址。
  • 其他问题最终与正则表达式有关,如 请求是为了操纵,而不是替换。

感谢。

1 个答案:

答案 0 :(得分:1)

  

Is this possible to do? If so, is my syntax bad?

您尝试匹配RewriteRule中的查询字符串时出现问题,因为RewriteRule仅用于匹配请求URI。

将规则更改为此以使其正常工作:

RewriteCond %{THE_REQUEST} \s/+index\.php\?main_page=product_info&cPath=0&products_id=97 [NC]
RewriteRule ^ /product-name-a? [R=302,L]

RewriteRule ^product-name-a/?$ /index\.php?main_page=product_info&cPath=0&products_id=97 [L,QSA]

此处RewriteCond正在使用THE_REQUEST变量来表示Apache从您的浏览器收到的原始请求。

参考:Apache mod_rewrite Introduction