微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 mod_rewrite 重定向循环

如何解决使用 mod_rewrite 重定向循环

我正在尝试通过 mod_rewrite 向我的页面添加语言前缀 例如:

https://example.com/ > https://example.com/en/

并且在内部它需要转换为`https://example.com/?language=en 我已经设法为基本 url 执行此操作,但是当我尝试使用其他隐含的重定向执行此操作时,它总是以无限循环结束。 例如:

https://example.com/product-p-22.html > https://example.com/en/product-p-22.html

并在内部变成了`https://example.com/product_info.PHP?product_id=22&language=en 这是我的实际配置:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !^/(en|fr)/
RewriteCond %{REQUEST_URI} .(PHP|html) [OR]
RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{QUERY_STRING} !language=
RewriteRule ^(.*)$ en/$1 [L,R=301]
RewriteCond %{REQUEST_URI} !^/example
RewriteRule ^(.*)/$ index.PHP?language=$1&%{QUERY_STRING}
RewriteRule ^(.*)/(.*)-p-(.*).html$ product_info.PHP?products_id=$3&language=$1&%{QUERY_STRING}

我尝试了许多标志,例如 L,END,DPI 或这些标志的组合,但都没有成功。 当我查看调试日志时,似乎找到了正确的 url,但随后重新开始解析认 url:

pass through /var/www/example/product_info.PHP
init rewrite engine with requested uri /product-p-22.html
pass through /product-p-22.html

在这里做错了什么吗?

Server version: Apache/2.4.41 (Ubuntu)

解决方法

根据您显示的示例,您能否尝试以下操作。请确保在测试您的网址之前清除浏览器缓存。

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !^en [NC]
RewriteRule ^(.*)$ en/$1 [NC,R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php?language=en [NC,QSA,L]

RewriteRule ^([^/]*)/([^-]*)-p-([^.]*)\.html$ product_info.php?products_id=$3&language=$1& [NC,L,QSA]
,

在您的站点根目录 .htaccess 中使用这种方式:

RewriteEngine On

RewriteCond %{THE_REQUEST} !\s/+(en|fr)/ [NC]
RewriteRule ^ /en%{REQUEST_URI} [NC,L]

RewriteRule ^([a-z]{2})/[^-/]+-p-([^./]+)\.html?$ product_info.php?language=$1&products_id=$2 [L,QSA]

RewriteRule ^([a-z]{2})/$ index.php?language=$1 [QSA,L]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。