mod_rewrite等效于RedirectMatch规则

时间:2011-11-12 19:37:27

标签: apache .htaccess mod-rewrite

我的.htaccess文件中有一个RedirectMatch规则可以正常工作,但我在使用mod_rewrite时遇到类似的规则时遇到了麻烦。

我的目标是拥有以下网址:mysite.com/anything/print显示此页面:mysite.com/anything?view=print。

用于重定向它的规则是:

 RedirectMatch 301 ^(.*)/print/?$ http://mysite.com/$1?view=print

但现在我想使用mod_rewrite将其从可见的301重定向更改为“隐形”重写。我已尝试过很多不同的变体(有和没有RewriteBase),但没有一个有效:

 RewriteEngine On
 RewriteBase /
 RewriteRule ^(.*)/print/? $1?view=print

我做错了什么? Mod_rewrite肯定已启用,并且在同一.htaccess文件中有基于Wordpress的mod_rewrite规则。


更新

使用来自@Nathan的提示,我现在有了这个。但是,当我访问mypost / print时,我仍然得到404.

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !^/index\.php
RewriteRule ^(.*)/print/?$ /index.php/$1?view=print [L]

当我将/ print /追加到固定链接时,WP_Debug插件会指示以下内容:

请求: myposttype/mypost/print

查询字符串: attachment=print

匹配重写规则: myposttype/[^/]+/([^/]+)/?$

匹配重写查询: attachment=print

2 个答案:

答案 0 :(得分:2)

如果您在htaccess文件中有典型的wordpress规则,那么您的规则应该在# BEGIN WordPress块之前。否则,wordpress规则将在您的规则被调用之前停止重写匹配。

此外,您应该在正则表达式模式之后添加$,除非您还希望匹配以下内容:http://domain.com/page/print/something/else/here

最后,为了让Wordpress能够在不重定向页面的情况下识别URL中的更改,您需要将URL附加到index.php/,以便Wordpress将使用路径信息永久链接。

E.g。

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !^/index\.php
RewriteRule ^(.*)/print/?$ /index.php/$1?view=print [L]

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

答案 1 :(得分:1)

RewriteEngine on
RewriteRule ^(.*)/print/$ /$1?view=print [L]

RewriteRule ^(.*)/print$ /$1?view=print [L]

在URL字符串

末尾没有“/”