.htaccess 重写URL后如何重定向页面

mec1mxoz  于 2023-01-31  发布在  其他
关注(0)|答案(1)|浏览(132)

我不得不重写网址,所以我已经使用下面的代码在我的htaccess这是工作

RewriteRule ^products/part/pumps/?$ pumps.php [L,NC]

如果有人试图访问URL链接exmple.com/products/part/pumps/,则它显示pumps.php数据。
现在我的问题是,如果有人试图访问www.example.com页面example.com/pumps.php,那么我如何重定向到此链接exmple.com/products/part/pumps/
我已经尝试,但得到一个重定向错误

Redirect 301  /pumps.php /products/part/pumps/

我有许多网页,我必须重定向他们也.在这里分享两个例子

RewriteRule ^power\.php$ /products/engine/power/ [R=301,L]
RewriteRule ^connecting\.php$ /products/connection/power/connecting/ [R=301,L]
slwdgvem

slwdgvem1#

在现有重写 * 之前 * 使用以下代码:

# External redirect
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^pumps\.php$ /products/part/pumps/ [R=301,L]

(But首先使用302重定向进行测试,以避免潜在的缓存问题。)
通过检查REDIRECT_STATUS环境变量是否为"空",我们可以只重定向来自用户的直接请求,而不是稍后重写的重写请求。成功重写请求后,REDIRECT_STATUS的值为200(如200 OK HTTP状态)。
RewriteCond(condtion)指令必须位于触发外部重定向的每个RewriteRule指令之前。
Redirect指令(mod_alias的一部分,而不是mod_rewrite)是无条件处理的,最终将重定向重写的请求,从而导致重定向循环。

使用END标志而不是RewriteCond(需要Apache 2.4)

或者,您可以修改现有的重写,使用END标志(而不是L)来防止重写引擎的循环。然后可以省略上面提到的RewriteCond指令。但请注意,END标志仅在Apache 2.4+上可用。
例如:

# External redirects
RewriteRule ^pumps\.php$ /products/part/pumps/ [R=301,L]

# Internal rewrites
RewriteRule ^products/part/pumps/?$ pumps.php [END,NC]

建议在内部重写之前将所有外部重定向组合在一起。
不幸的是,由于这些重写的不同性质,看起来不像规则可以进一步减少。

相关问题