我在托管的Apache服务器上的.htaccess中进行简单的重写时遇到了困难。
我读过的所有教程都使用正则表达式来使复杂的URL更加用户友好,特别是动态创建的URL。
一个例子:
RewriteRule ^product/([^/.]+)/?$ product.php?id=$1 [L]
会改变
www.yoursite.com/product.php?id=123
至
www.yoursite.com/product/123
然而,这并不像我想的那样方便用户使用。在使用动态网址的网站中,我想更改
/index.php?main_page=product_info&cPath=0&products_id=97
至
http://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
不会产生任何错误,但它不起作用。
这可能吗?如果是这样,我的语法不好吗?如果不可能,有人可以建议重写(不重定向)个别网址的方法吗?
我知道不使用正则表达式意味着更多的手工工作。我准备好了。这个数据来自一个文本文件,我将创建它。我不是在询问数据库访问或与数据来源有关的任何内容。
我不认为这是一个重复的问题:
感谢。
答案 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从您的浏览器收到的原始请求。