使用 .htaccess 重定向页面
Redirect page using .htaccess
你能帮我重定向吗
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
尝试以下操作,使用 mod_rewrite,在 .htaccess
文件的 顶部 文档根目录 :
RewriteEngine On
RewriteCond %{QUERY_STRING} ^lang=ru$
RewriteRule ^dev/kampaaniad/$ /dev/ru/kampaaniad/ [QSD,R=302,L]
RewriteRule
模式(即^dev/kampaaniad/$
)只匹配URL-路径,这就是为什么我们需要一个单独的条件(RewriteCond
指令)匹配查询字符串。
需要 QSD
标志才能从请求中删除原始查询字符串。
或者,使用反向引用来避免在 替换 字符串中重复:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^lang=(ru)$
RewriteRule ^(dev)/(kampaaniad/)$ //%1/ [QSD,R=302,L]
substitution 字符串中的 </code> 和 <code>
反向引用包含从 RewriteRule
pattern(即分别为 dev
和 kampaaniad/
)。 %1
反向引用包含来自前面 CondPattern.
中捕获组的 ru
如果 lang
URL 参数值在查询字符串中是可变的,则将最后一个示例中的 RewriteCond
指令修改为:
RewriteCond %{QUERY_STRING} ^lang=([a-z]{2})$
:
匹配任何2个字符的语言代码。
参考:
- https://httpd.apache.org/docs/current/rewrite/
- https://httpd.apache.org/docs/current/rewrite/intro.html
- https://httpd.apache.org/docs/current/mod/mod_rewrite.html
更新:
... redirect not working
从 更新的 问题中的完整 .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/
。
您不需要 <IfModule>
包装这些指令,也不需要重复 RewriteEngine
指令,因为这已经出现在 WordPress 代码块中。
要利用文件后面定义的RewriteBase /dev/
指令,您可以删除替换字符串上的路径前缀,例如:
:
RewriteRule ^kampaaniad/$ ru/kampaaniad/ [QSD,R=302,L]
因此,您也可以从以后的重写中删除路径前缀:
:
RewriteRule . index.php [L]
你能帮我重定向吗
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
尝试以下操作,使用 mod_rewrite,在 .htaccess
文件的 顶部 文档根目录 :
RewriteEngine On
RewriteCond %{QUERY_STRING} ^lang=ru$
RewriteRule ^dev/kampaaniad/$ /dev/ru/kampaaniad/ [QSD,R=302,L]
RewriteRule
模式(即^dev/kampaaniad/$
)只匹配URL-路径,这就是为什么我们需要一个单独的条件(RewriteCond
指令)匹配查询字符串。
需要 QSD
标志才能从请求中删除原始查询字符串。
或者,使用反向引用来避免在 替换 字符串中重复:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^lang=(ru)$
RewriteRule ^(dev)/(kampaaniad/)$ //%1/ [QSD,R=302,L]
substitution 字符串中的 </code> 和 <code>
反向引用包含从 RewriteRule
pattern(即分别为 dev
和 kampaaniad/
)。 %1
反向引用包含来自前面 CondPattern.
ru
如果 lang
URL 参数值在查询字符串中是可变的,则将最后一个示例中的 RewriteCond
指令修改为:
RewriteCond %{QUERY_STRING} ^lang=([a-z]{2})$
:
匹配任何2个字符的语言代码。
参考:
- https://httpd.apache.org/docs/current/rewrite/
- https://httpd.apache.org/docs/current/rewrite/intro.html
- https://httpd.apache.org/docs/current/mod/mod_rewrite.html
更新:
... redirect not working
从 更新的 问题中的完整 .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/
。
您不需要 <IfModule>
包装这些指令,也不需要重复 RewriteEngine
指令,因为这已经出现在 WordPress 代码块中。
要利用文件后面定义的RewriteBase /dev/
指令,您可以删除替换字符串上的路径前缀,例如:
:
RewriteRule ^kampaaniad/$ ru/kampaaniad/ [QSD,R=302,L]
因此,您也可以从以后的重写中删除路径前缀:
:
RewriteRule . index.php [L]