我们正在从一种站点语言/ 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”...但是我也不能让它工作(如果它甚至适合使用)。
任何想法都会受到欢迎......
答案 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上的重写引擎将无法工作。