【问题标题】:mod_rewrite equivalent of a RedirectMatch rule等效于 RedirectMatch 规则的 mod_rewrite
【发布时间】:2011-12-27 18:23:55
【问题描述】:

我的 .htaccess 文件中有一个 RedirectMatch 规则可以正常工作,但我无法使用 mod_rewrite 提出类似的规则。

我的目标是让这个 URL:mysite.com/anything/print 显示这个页面:mysite.com/anything?view=print。

重定向它的规则是这样的:

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

但现在我想将其从可见的 301 重定向更改为使用 mod_rewrite 的“不可见”重写。我已经尝试了许多不同的变体(有和没有 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

【问题讨论】:

    标签: apache .htaccess mod-rewrite


    【解决方案1】:

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

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

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

    例如

    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
    

    【讨论】:

    • 这似乎应该可以工作,但是当我转到 domain.com/mypost/print 时仍然得到 404。使用 WP Debug 插件,我看到查询正在寻找附件 = 打印(带有“打印”标签的媒体附件)。你能想出解决办法吗?
    • WordPress 将使用原始 URL 来解析永久链接,除非您将重定向更改为使用路径信息永久链接,如 index.php/url/path/here?view=print。我已更新示例以包含路径信息方法。
    • 非常感谢您的更新。更新后的代码发生了相同的 404 和 attachment=print 查询;刷新固定链接没有帮助。手动插入 index.php(例如 mysite.com/index.php/mypost/print)也不起作用,并给出相同的 404。有什么想法吗?
    • 我已更新问题以显示我使用您的新代码获得的 WP_Debug 的结果。
    【解决方案2】:
    RewriteEngine on
    RewriteRule ^(.*)/print/$ /$1?view=print [L]
    

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

    网址字符串末尾不带“/”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-23
      • 2015-01-13
      • 2014-05-10
      • 1970-01-01
      • 2018-02-03
      • 1970-01-01
      相关资源
      最近更新 更多