重定向-删除自定义查询字符串

时间:2015-12-07 作者:Crys

我对一些页面URL有问题。页面URL结构如下所示:

www.example.com/wp/custom-taxonomy/somepagename/?token=12345
我希望在访问上述URL时将我重定向到:

www.example.com/wp/custom-taxonomy/somepagename/
在中/wp/ 已安装WordPress。我试过这个.htaccess:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /wp/
RewriteCond %{query_string} ^token=12345
RewriteRule (.*) /$1? [R=301,L]
RewriteRule ^index\\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wp/index.php [L]
</IfModule>
但它让我转向:

www.example.com/custom-taxonomy/somepagename
有什么想法吗?

Later edit:

/wp/ - 安装Wordpress的文件夹;

/custom-taxonomy/ - 自定义分类法,如/partners/ 在那里我输入我的所有伙伴。

/somepagename - 动态页面,如/xyz-ltd, /abcd... 为自定义分类法创建的动态页面。

我不能为每个页面设置规则,需要一个常规规则来删除查询字符串。

4 个回复
SO网友:jgraup

您可以使用add_rewrite_rule 在WordPress中捕获查询参数或add_rewrite_endpoint. 如果你真的只是想根据某些规则重定向,那么template_redirect 可以很好地使用标头重定向。

SO网友:IXN

我认为问题出在permalink配置中。似乎WP重定向

www.example.com/slug/somepagename/

www.example.com/slug/somepagename
无论如何。如果您解决了这个问题,可能需要在wp admin中设置permalinks,那么重定向就会起作用。

这很有趣,但我现在正在为我的网站做同样的事情,将移动查询(?m=1)重定向到主页。所以我可以确认你的代码是正确的。唯一不同的是在查询的末尾添加$,如^token=12345$, 但我不认为这有什么区别。

SO网友:MrWhite

RewriteBase /wp/
RewriteCond %{query_string} ^token=12345
RewriteRule (.*) /$1? [R=301,L]
但它让我转向:

www.example.com/custom-taxonomy/somepagename
重定向的URL有两个问题:

/wp 缺少前缀。

缺少尾部斜杠。

修复#1 您可以:

硬编码/wp 替换字符串中的前缀(与上次一样RewriteRule - WordPress前端控制器的一部分-尽管这可能不正确,但请参阅下一点)。例如:

RewriteRule (.*) /wp/$1? [R=301,L]
自从RewriteBase /wp 如果已定义,则只需删除替换字符串上的斜杠前缀(使其成为相对路径替换)。ie。$1?. mod\\u rewrite然后在/wp 结果替换的路径段。例如:

RewriteRule (.*) $1? [R=301,L]
旁白:这真的是RewriteRule 应写入。ie。RewriteRule . index.php [L] (因为这就是RewriteBase /wp 首先定义)。

更改规则以使用REQUEST_URI 服务器变量而不是反向引用($1). 这个REQUEST_URI 包含完整的根相对URL路径,因此已包含/wp 前缀这可能是首选方法(除非有其他要求),因为它可以在任何地方工作,并且不依赖于RewriteBase. 例如:

RewriteRule ^ %{REQUEST_URI}? [R=301,L]
然而,这并不能解决#2 - 缺少的尾部斜杠。这不是由该指令引起的-其他原因是删除了尾部斜杠(如果它在初始请求中存在的话)。一个可能的原因是中建议的permalink结构@IXN\'s answer. 如果尾部斜杠是初始请求的一部分(如问题中所示),则此指令会专门保留它。如果初始请求中缺少尾部斜杠,则重定向响应中也将缺少尾部斜杠(有关如何修复此问题,请参见下文)。为了进一步调试,您应该检查网络流量中是否有任何其他重定向。

Additional notes:

<您应该避免在# BEGIN WordPress 部分,因为WordPress将尝试维护此内容并覆盖您的编辑。此重定向应位于.htaccess 文件,在# BEGIN WordPress 部分

  • ^token=12345 - 包括一个和的字符串锚($) 仅匹配此查询字符串。就目前情况而言,它匹配任何仅以开头的查询字符串token=12345.

    在Apache 2.4上使用QSD (查询字符串丢弃)标志,而不是附加空查询字符串(单独?) 在替换字符串上。

    目前,此规则与任何URL路径匹配。包括所有静态资源(图像、CSS、JS)等。它并不特别匹配/wp/<custom-taxonomy>/<somepagename>/ - 所述的URL格式。理想情况下,您的规则应该尽可能具体,只匹配目标URL,以避免不必要的重定向和额外的规则处理。例如:

    RewriteRule ^[\\w-]+/[\\w-]+/$ %{REQUEST_URI} [QSD,R=301,L]
    
    The\\w 速记字符类与字符匹配a-z, A-Z, 0-9_ (下划线)因此很自然地避免了匹配静态资源,这些资源通常具有以点为前缀的文件扩展名。

    要匹配初始请求上的可选尾部斜杠,但始终在重定向URL上包含尾部斜杠,则可以执行以下操作:

    # Trailing slash optional on request and slash always appended
    # (Dependent on RewriteBase)
    RewriteRule ^([\\w-]+/[\\w-]+)/?$ $1/ [QSD,R=301,L]
    
    然而,这现在取决于RewriteBase 指令(获取目录前缀),如上所述。尽管您可以使用条件(RewriteCond 指令)删除对RewriteBase. 例如:

    # Trailing slash optional on request and slash always appended 
    # (Not dependent on RewriteBase)
    RewriteCond %{REQUEST_URI} (.*?)/?$
    RewriteRule ^([\\w-]+/[\\w-]+)/?$ %1/ [QSD,R=301,L]
    
    始终使用302(临时)重定向进行测试,以避免潜在的缓存问题(浏览器持久缓存301s,包括错误的重定向)。测试前清除浏览器缓存。

    总而言之

       # Trailing slash optional on request and slash always appended
       # Full URL-path used, including subdirectory preifx
       # Not dependent on RewriteBase
       RewriteCond %{QUERY_STRING} ^token=12345$ [NC]
       RewriteCond %{REQUEST_URI} (.*?)/?$
       RewriteRule ^([\\w-]+/[\\w-]+)/?$ %1/ [QSD,R=301,L]
    
       # BEGIN WordPress
       :
    

  • SO网友:mukto90

    在您的中使用此选项。htaccess-

    Redirect 301 /slug/somepagename/?token=12345 http://www.example.com/wp/slug/somepagename/
    

    相关推荐

    Custom URL redirect in WP

    我正在尝试为外部链接创建自己的重定向页面。My target我的目标是,当用户打开链接时www.mysite.com/wp/GoTo/?URL=www.google.com, 浏览器打开页面www.google.comWhat I have done我保存了以下内容GoTo.php 文件夹中的文件wp-content/themes/theme-name/:<?php /* Template Name: GoTo */ /** *