在Apache中,如何从特定路径和查询字符串重定向?

时间:2012-02-10 20:13:44

标签: apache redirect

我想重定向,例如,

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以及RewriteCondRewriteRule的某些组合来完成此操作,但我已经在进行一些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.phpproduct.php的PHP脚本来处理重定向....我是否只是远离解决方案的几个字符?

2 个答案:

答案 0 :(得分:0)

未加载资源(样式表,图像等),因为可能存在无效的相对路径。

问题是浏览器将“类别”视为文件夹,因此资源的路径无效。

快速修复(如果您在域/子域上而不是在文件夹中运行)是将/放在所有资源的路径中。

例如:将style.css更改为/style.css,以便在您进入类别页面时仍然包含它。

答案 1 :(得分:0)

我从来没有弄明白这个问题,但是我通过改变指令的顺序解决了它,没有别的。我将新的重定向移到了RewriteBase指令之后,一切都运行良好。