在Apache2和Drupal中重定向旧URL的模式

时间:2011-07-08 22:53:48

标签: regex drupal mod-rewrite redirect apache2

mod_rewrite一直是我最薄弱的领域之一。我试图找到一段时间的解决方案,许多答案只是链接到mod_rewrite documentation,这对我没有帮助。我相信我的问题很简单,所以我希望有人不介意这次给我一个免费赠品。

我对Drupal有一些现有的mod_rewrite规则:

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

当然,工作正常;他们是库存Drupal规则。

我想重定向

的请求
  /snippet/yyyy-MMM-dd/name-of-article

  /snippets/name-of-article

所以我把规则改为:

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^snippet/20[0-9]{2}-[a-z]{3}-[0-9]{2}/(.*)$ snippets/$1 [L,R=301] ### MY NEW RULE
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

我的新规则按预期工作,并正确执行重定向。但是,它似乎会影响CSS和JS请求,这可以通过错误日志中缺少样式和scriptin,g和404错误来证明。如果我尝试直接查看CSS或JS文件,我会得到与我请求父文档相同的HTML输出。所以,显然,我的规则被打破了。

我不知道为什么这么难 - 看起来很简单。

1 个答案:

答案 0 :(得分:0)

好吧,我学到了一些东西。 RewriteCond会影响他们之前的RewriteRule。杜!

这有效:

RewriteEngine on
RewriteBase /

RewriteRule ^snippet/20[0-9]{2}-[a-z]{3}-[0-9]{2}/(.*)$ snippets/$1 [L,R=301] ### MY NEW RULE

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]