需要Apache重写器规则协助

kcwpcxri  于 2023-03-19  发布在  Apache
关注(0)|答案(1)|浏览(121)

我正在尝试删除查询字符串:?id=来自此URL:
https://example.com/news-and-events/news/?id=/nodle/nodle-io/ledger-integration-update-compatibility-status-236699676dc6
并保持页面加载/工作正常
我试过这个:
重写引擎打开
重写条件%{查询字符串} ^(.)?ID=(.)?$ [NC]
重写规则^(.*)?$$1%2?[R=301,L]
它似乎剥离了?id=出罚款,但页面不会加载,只是404 s.
我的问题是使内容加载/结转到新的URL。
https://example.com/news-and-events/news/nodle/nodle-io/ledger-integration-update-compatibility-status-236699676dc6
感谢任何帮助,谢谢Rob
期望URL加载良好,而不是404,但与较短的URL。

2sbarzqh

2sbarzqh1#

更新答案:

缺少/是因为您可能还没有声明RewriteBase。由于您正在使用整个REQUEST_URI,下面代码中的这个应该可以完成。
另外,RewriteCond的第二括号表达式需要*来提供完整的QUERY_STRING(减少了搜索模式id=/)。
文件:/news-and-events/news/.htaccess

RewriteEngine On
RewriteBase "/news-and-events/news/"

RewriteCond %{QUERY_STRING} ^(.)?id=/(.*)?$ [NC]
RewriteRule ^(.*)?$ $1%2? [R=301,L]

简化版

文件:/news-and-events/news/.htaccess

RewriteBase /news-and-events/news/
RewriteCond "%{QUERY_STRING}" "^id=/(.*)" [NC]
RewriteRule "(.*)" "$1%1?" [R=301,L]

virtualhost.conf文件中:

在此,背景至关重要:

<VirtualHost *:80>

    DocumentRoot "/var/www/vhosts/myhost/htdoc/"
    # Other directives
    
    # Only required once:
    RewriteEngine On
        
    <Directory "/var/www/vhosts/myhost/htdoc/news-and-events/news/">
        RewriteBase "/news-and-events/news/"
        RewriteCond "%{QUERY_STRING}" "^id=/(.*)" [NC]
        RewriteRule "(.*)" "$1%1?" [R=301,L]
    </Directory>
    
    # More <Directory> container
    
</VirtualHost>

顺便说一句:用双引号将模式括起来是一个好习惯,即使并不总是必要的。

一些评论

您与QUERY_STRING进行匹配:

QUERY_STRING = 'id=/nodle/nodle-io/ledger-integration-update-compatibility-status-236699676dc6'

在URL中,它总是以?后面的字符 * 开始,因此RewriteCond中的匹配不
由于正则表达式是贪婪的,并且您选择了整个字符串,因此强制字符串的^开始和$结束是过时的。另外,通过?使其可选也是不必要的,因为(.*)本身可能计算为空。

说明

  • 同时,你已经透露,该代码将驻留在apache服务器的virtualhost.conf文件中。
  • 此外,配置不是独立的,而是WordPress安装的子目录,它也使用一些重写规则。因为您已经启用了.htaccess的指令,但希望在virtualhost.conf-文件中写入规则。
  • 使用propper容器对于防止与Wordpress安装的交叉影响(双向)至关重要。
AllowOverride All
  • 你应该首先清理所有可能仍然存在的以前的“实验”在.htaccess文件来解决你的问题。-真的很重要!*

但很明显你的意图和你的问题正好相反:

这样做有它的意义,当涉及到一个变化的URI结构(即由于服务软件的变化),你希望你的访问者能够跟随内容。同样通过HTML状态码301 · Moved permanently搜索引擎将很快学会使用新的URI逻辑,并保持搜索引擎优化。

相关问题