【问题标题】:PHP: Rewrite rule with variable query stringPHP:使用可变查询字符串重写规则
【发布时间】:2017-08-14 21:28:58
【问题描述】:

我正在将我们的网站 URL 结构从 site.com/?team=john-doe 更改为 site.com/attorney/john-doe。我在 htaccess 文件中有典型的 WordPress Htaccess 重写规则,但我遇到的问题是我们有多个律师,其名称后跟 ?team=。我正在尝试做一个规则来重定向所有名称为变量的人 - 如果这有意义的话。

site.com/?team=jane-doe
site.com/?team=nic-cage

下面我注释掉了一个方法,但是当我尝试它时,我得到了 500 Internal Server 错误:

# 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]

#RewriteCond %{REQUEST_URI} ^/$
#RewriteCond %{QUERY_STRING} ^?team=([x]*)$
#RewriteRule ^(.*) site.com/attorneys/$1 [R=302,L]
</IfModule>

# END WordPress

我也应用了这个正则表达式:

RedirectMatch 301 ^/?team=(.*)$ site.com/attorneys/$1

Regex 非常令人困惑,如果我没有任何意义,请见谅。如果需要,我可以尝试澄清。

【问题讨论】:

    标签: php regex wordpress .htaccess redirect


    【解决方案1】:

    这只是一个猜测,但我认为

    中的领先问号?
    RewriteCond %{QUERY_STRING} ^?team=([x]*)$
    

    500服务器错误的原因,因为?是一个特殊字符。

    ? 表示前面的元素是可选的,但是由于^?team= 中没有前面的元素,所以这是一个错误。如果要匹配文字问号,则必须使用反斜杠 \? 对其进行转义。

    尽管在这种情况下(QUERY_STRING),这不是必需的,因为QUERY_STRING 不包含前导问号,只是查询字符串本身。这意味着检查 team=(.*) 就足够了

    RewriteCond %{QUERY_STRING} ^team=(.*)$
    

    该规则还有其他问题

    • RewriteCond %{REQUEST_URI} ^/$ 将只匹配主页,不匹配其他内容
    • RewriteRule ^(.*) site.com/attorneys/$1 [R=302,L] 不会重定向到 site.com,因为它缺少 http://
    • 最后,RewriteCond 中匹配的反向引用是 %1 而不是 $1

    【讨论】:

    • 感谢您的描述性回复。因此,我将我的规则更新为您所建议的内容,并且目前正在将 ?team=john-doe 附加到新的目标 URL。例如,http://www.example.com/attorneys/?team=john-doe
    • 是的,我错过了。我的回答只是解释了为什么会出现 500 错误。但是@starkeen 已经通过在目标上添加问号的方式解决了这个问题。这可以防止之前的查询字符串被添加到新目标中。
    【解决方案2】:

    RedirectMatch 仅适用于 uris 。您无法使用此指令访问查询字符串。您可以使用以下 RewriteRule ,将其添加到您的 wordpress 规则之前:

    RewriteEngine on
    
    RewriteCond %{QUERY_STRING} ^team=(.+)$
    RewriteRule ^ http://example.com/attorneys/%1? [L,R]
    

    【讨论】:

    • 谢谢 - 我会在下班后试一试。会回来报告的!
    【解决方案3】:

    我不太确定,但你可以试试这个
    RewriteRule ^/?team=(.*)$ http://Yoursitename/attorneys/$1 [R=301,L]

    【讨论】:

    • 谢谢 - 我会在下班后试一试。会回来报告的!
    • 嗨@Ankit Prajapati,最终解决方案是RewriteCond %{QUERY_STRING} ^team=(.*)$ RewriteRule ^(.*) https://www.andrewsmyers.com/attorneys/%1? [R=301,L]
    猜你喜欢
    • 2015-09-10
    • 2021-08-24
    • 2016-08-13
    • 2016-11-01
    • 2012-03-11
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多