【问题标题】:Redirect page using .htaccess使用 .htaccess 重定向页面
【发布时间】:2021-09-29 12:05:21
【问题描述】:

你能帮我重定向吗

https://example.com/dev/kampaaniad/?lang=ru

https://example.com/dev/ru/kampaaniad/

更新: .htaccess 代码:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{QUERY_STRING} ^lang=ru$
RewriteRule ^dev/kampaaniad/$ /dev/ru/kampaaniad/ [QSD,R=302,L]
</IfModule>

# BEGIN WordPress

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /dev/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /dev/index.php [L]
</IfModule>

# END WordPress

【问题讨论】:

  • 欢迎来到 SO,请在您的问题中添加您尝试过的 htaccess 规则作为您在 SO 上受到高度鼓励的努力,谢谢。
  • 你的.htaccess文件在哪个目录下?

标签: apache .htaccess mod-rewrite


【解决方案1】:

使用 mod_rewrite 在您的.htaccess 文件文档根目录顶部尝试以下操作:

RewriteEngine On

RewriteCond %{QUERY_STRING} ^lang=ru$
RewriteRule ^dev/kampaaniad/$ /dev/ru/kampaaniad/ [QSD,R=302,L]

RewriteRule pattern(即^dev/kampaaniad/$)只匹配 URL 路径,这就是为什么我们需要一个单独的条件RewriteCond 指令) 来匹配查询字符串。

QSD 标志是从请求中删除原始查询字符串所必需的。

或者,使用反向引用来避免 substitution 字符串中的重复:

RewriteEngine On

RewriteCond %{QUERY_STRING} ^lang=(ru)$
RewriteRule ^(dev)/(kampaaniad/)$ /$1/%1/$2 [QSD,R=302,L]

substitution 字符串中的$1$2 反向引用包含从RewriteRule 捕获的子组模式(即devkampaaniad/分别)。 %1 反向引用包含来自前面 CondPattern 中捕获组的 ru

如果lang URL 参数值在查询字符串中是可变的,则将上一个示例中的RewriteCond 指令修改为:

RewriteCond %{QUERY_STRING} ^lang=([a-z]{2})$
:

匹配任何 2 个字符的语言代码。

参考:


更新:

...重定向不起作用

从您更新问题中完整的.htaccess 文件的外观来看,您的.htaccess 文件可能位于/dev 子目录中?使用上面的指令,我自然假设您会将.htaccess 文件放在文档根(父)目录中。

如果.htaccess 文件位于/dev/.htaccess 而不是/.htaccess,那么您需要修改上面RewriteRule 中使用的正则表达式,如下所示:

RewriteCond %{QUERY_STRING} ^lang=ru$
RewriteRule ^kampaaniad/$ /dev/ru/kampaaniad/ [QSD,R=302,L]

RewriteRule 模式 将 URL 路径 相对 匹配到 .htaccess 文件所在的目录。因此,当.htaccess 文件位于/dev 子目录中时,^kampaaniad/$ 与 URL /dev/kampaaniad/ 匹配。

您不需要围绕这些指令使用 &lt;IfModule&gt; 包装器,也不需要重复 RewriteEngine 指令,因为这已经发生在 WordPress 代码块中。

要利用文件后面定义的RewriteBase /dev/ 指令,您可以删除substitution 字符串上的路径前缀,例如:

:
RewriteRule ^kampaaniad/$ ru/kampaaniad/ [QSD,R=302,L]

因此,您还可以从以后的重写中删除路径前缀:

:
RewriteRule . index.php [L]

【讨论】:

  • @MartinAbramov 请编辑您的问题以包含您的完整 .htaccess 代码(不在 cmets 中)。谢谢。 “不工作”到底是什么意思?
  • 我的意思是重定向不起作用,我添加了相关代码的屏幕截图。非常感谢您的帮助!
  • @MartinAbramov 重定向“不起作用”的方式是什么?它不会重定向到/dev/ru/kampaaniad/ 吗?请复制/粘贴实际代码(格式使用反引号或使用工具栏缩进 4 个空格) - 而不是链接到屏幕截图。
  • 顺便说一句,您不需要将这些指令包装在 &lt;IfModule&gt; 容器中。您也不需要重复 RewriteEngine 指令。
  • 非常感谢您的回答和解释!效果很好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 2012-08-16
相关资源
最近更新 更多