通过htaccess或httpd.conf进行基本的静态到静态重写(或重定向)

时间:2010-08-13 13:21:09

标签: .htaccess mod-rewrite redirect rewrite rewritemap

我们正在从一种站点语言/ CMS(coldfusion / custom)转移到另一种(PHP / Drupal),并且需要将我们的一些旧页面重定向到新页面。我可以访问.htaccess和httpd.conf(以及apache2.conf),因为这是Linode上的vps。

大多数都无法通过正则表达式完成(它们在URL中包含GUID),我们可以编写静态重定向。

以下是一个例子:

  RewriteRule /show.cfm/FG3f4-30F1G/ http://www.mysite.com/john-smith [R=301]

就是这样......我已经尝试了使用起始插入符号的语法^,结束美元符号,似乎没有任何工作。

我可能对RewriteCond扮演什么角色有误解 - .htaccess中还有其他行。

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

指定RewriteRule后是否需要重新声明RewriteCond?

另外 - 理想情况下,为了保持.htaccess的清洁度,我想使用RewriteMap,我可以在其中指定一个文本文件,并且只有两个制表符分隔的列“old url | new url”...但是我也不能让它工作(如果它甚至适合使用)。

任何想法都会受到欢迎......

3 个答案:

答案 0 :(得分:0)

对于您的第一个静态示例,最好使用Redirect指令而不是mod_rewrites RedirectRule。

RewriteCond仅适用于直接跟随它的RewriteRule。因此,在您的OP中,conds指出所请求的URI是不是真实文件还是导演,并且它不是favicon,然后将其重定向到index.php

关于您使用克拉尝试它并且它不起作用,这可能是路径问题,确切的解决方案取决于RewriteRule是位于httpd.conf文件还是.htaccess中。在httpd.conf中匹配的一般规则模式将在正斜杠之前,而在.htaccess文件中匹配的规则模式则不会。

答案 1 :(得分:0)

正如Cags所指出的,如果您在.htaccess文件中定义规则,则需要确保路径不包含前导斜杠。此外,您可能需要确保使用L标志,并将重定向规则放在WordPress重写部分之上,因为这两件事情都可能最终导致冲突。

例如:

RewriteRule ^/?show.cfm/FG3f4-30F1G/$ http://www.mysite.com/john-smith [R=301,L]

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

如果要使用RewriteMap,则需要在服务器或虚拟服务器配置中定义它。通常这对大多数人来说都是一个问题,但是既然你已经表明你正在使用VPS,我认为你有必要的访问权限。请注意,出于效率原因,将所有mod_rewrite指令放在那里也是有益的,因为必须为每个请求解析.htaccess(但服务器配置仅在启动时处理)

httpd.conf(或等效的)中定义服务器地图将如下所示:

RewriteMap redirect-map txt:/full/path/to/file/pathmap.txt

然后,您将相应地修改您的规则:

RewriteRule ^/?(show\.cfm/[A-Za-z0-9-]+/)$ http://www.example.com/${redirect-map:$1} [R=301,L]

... pathmap.txt看起来像:

# Input                Replacement
show.cfm/FG3f4-30F1G/  john-smith
show.cfm/ABC12-40000/  jane-doe
...

答案 2 :(得分:0)

如果您使用的是“Linode”VPS,则还需要将“虚拟主机”配置文件更新为“AllowOverride None”中的“AllowOverride All”字符串。

通常,在LInode上,此配置文件位于“/ etc / apache2 / sites-enabled”目录中。在不更改此目录中的文件的情况下,Linode上的重写引擎将无法工作。