我想重定向,例如,
http://mystore.com/category.php?id=123
到
http://mystore.com/categories/foo
以及,例如,
http://mystore.com/product.php?id=456
到
http://mystore.com/products/bar
这些将是永久性(301)重定向,并且将有大约十二个。我不需要从路径或查询字符串中提取任何信息,我只需要完全匹配它们。我希望尽可能避免指定绝对URL。
我认为可以使用mod_rewrite
以及RewriteCond
和RewriteRule
的某些组合来完成此操作,但我已经在进行一些URL重写并且到目前为止我的尝试都不受欢迎结果
以下是我的.htaccess
文件之前的匿名摘录任何修改:
RewriteBase /
RewriteRule sitemap.xml index.php?route=sitemap [L]
# skip files and directories
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^?]*) index.php?route=$1 [L,QSA]
这是按预期工作的。我尝试在最后一行之前添加几种不同的条件和规则组合,最近一次是
RewriteCond %{QUERY_STRING} id=123
RewriteRule category.php categories/foo [L,R=301]
关于最后一条规则的事情会导致问题。主页加载,但样式表,图像和其他资源不加载。
此时,我正在考虑创建名为category.php
和product.php
的PHP脚本来处理重定向....我是否只是远离解决方案的几个字符?
答案 0 :(得分:0)
未加载资源(样式表,图像等),因为可能存在无效的相对路径。
问题是浏览器将“类别”视为文件夹,因此资源的路径无效。
快速修复(如果您在域/子域上而不是在文件夹中运行)是将/放在所有资源的路径中。
例如:将style.css更改为/style.css,以便在您进入类别页面时仍然包含它。
答案 1 :(得分:0)
我从来没有弄明白这个问题,但是我通过改变指令的顺序解决了它,没有别的。我将新的重定向移到了RewriteBase
指令之后,一切都运行良好。