【发布时间】:2019-12-21 09:44:22
【问题描述】:
我现在的.htaccess长这样,目前有保证https-access的功能:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
但是,我希望它做得更多,因为我当前的链接结构对 SEO 并不友好。基本上,我想进行更改,以便我可以输入左侧的 URL,并加载右侧的 URL。
https://nexuscompendium/heroes/li-li/ --> https://nexuscompendium.com/hero.php?h=li-li
https://nexuscompendium/heroes/ --> https://nexuscompendium.com/heroes/
我想出了以下似乎工作得很好...只要上面的 HTTPS 规则也不是活动的,因为其他规则只是再次删除了“https://”。
RewriteRule heroes\/role\/([a-zA-Z]+)(\/?)$ herorole.php?r=$1 [L]
RewriteRule heroes\/([a-zA-Z\-]+)(\/?)$ hero.php?h=$1 [L]
RewriteRule battlegrounds\/([a-zA-Z\-]+)(\/?)$ battleground.php?b=$1 [L]
RewriteRule rotations\/([0-9\-]+)(\/?)$ rotation.php?r=$1 [L]
RewriteRule sales\/([0-9\-]+)(\/?)$ sale.php?s=$1 [L]
RewriteRule predictions\/([0-9\-]+)(\/?)$ predictions.php?w=$1 [L]
RewriteRule universes\/([a-zA-Z\-]+)(\/?)$ universe.php?u=$1 [L]
RewriteRule subuniverses\/([a-zA-Z\-]+)(\/?)$ subuniverse.php?s=$1 [L]
RewriteRule events\/seasonal\/([a-zA-Z\-]+)(\/?)$ seasonal.php?s=$1 [L]
RewriteRule events\/([a-zA-Z0-9\-]+)(\/?)$ event.php?e=$1 [L]
RewriteRule skins\/([a-zA-Z0-9\-]+)(\/?)$ skin.php?s=$1 [L]
RewriteRule mounts\/([a-zA-Z0-9\-]+)(\/?)$ mount.php?m=$1 [L]
RewriteRule ([a-zA-Z]+)(\/?)$ $1.php
长话短说:我可以结合上述规则吗?如果可以,如何结合?如果没有,有没有办法确保 HTTPS 重定向?
提前谢谢❤
编辑:感谢 .htaccess 循环直到没有更多规则可以完成(以及在最后一个 RewriteRule 中略微添加 ^ 的知识,我得到了它的工作,如下所示:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
<IfModule mod_rewrite.c>
RewriteRule ^heroes\/role\/([a-zA-Z]+)(\/?)$ herorole.php?r=$1 [L]
RewriteRule ^heroes\/([a-zA-Z\-]+)(\/?)$ hero.php?h=$1 [L]
RewriteRule ^battlegrounds\/([a-zA-Z\-]+)(\/?)$ battleground.php?b=$1 [L]
RewriteRule ^rotations\/([0-9\-]+)(\/?)$ rotation.php?r=$1 [L]
RewriteRule ^sales\/([0-9\-]+)(\/?)$ sale.php?s=$1 [L]
RewriteRule ^predictions\/([0-9\-]+)(\/?)$ predictions.php?w=$1 [L]
RewriteRule ^subuniverses\/([a-zA-Z\-]+)(\/?)$ subuniverse.php?s=$1 [L]
RewriteRule ^universes\/([a-zA-Z\-]+)(\/?)$ universe.php?u=$1 [L]
RewriteRule ^events\/seasonal\/([a-zA-Z\-]+)(\/?)$ seasonal.php?s=$1 [L]
RewriteRule ^events\/([a-zA-Z0-9\-]+)(\/?)$ event.php?e=$1 [L]
RewriteRule ^skins\/([a-zA-Z0-9\-]+)(\/?)$ skin.php?s=$1 [L]
RewriteRule ^mounts\/([a-zA-Z0-9\-]+)(\/?)$ mount.php?m=$1 [L]
RewriteRule ^([a-zA-Z]+)(\/?)$ $1.php
</IfModule>
【问题讨论】:
-
据我所知,这并不是一个关于重写规则的问题。上面的规则确实not 将客户端从 https 重定向到 http 协议(这实际上是不可能自动实现的)。这里有两个可能的问题:1.您需要注意将重定向到 https 高于该动态配置文件(“.htaccess”)中的其他规则,否则请求不会被重定向到 https . 2.你有一些应用程序逻辑再次重定向到http(这也会导致浏览器警告和问题)。
-
您应该能够在查看浏览器开发控制台时进行调试,检查其中的“网络”选项卡。这是您将看到发送的实际重定向的地方。
-
我尝试先添加 HTTPS 部分,它可以工作(也由我用来测试的工具确认:htaccess.madewithlove.be)。但是,我不知道是什么原因导致它再次“重定向”到 http?
-
那么,当您按照建议进行调试时,您会看到哪些重定向?您如何确保您没有查看缓存的结果?此外,了解当您被“返回”到 http 时实际发生的情况也会很有趣。仅仅因为今天的浏览器都不会遵循这样的重定向......
-
我知道的唯一调试是我提供的链接。我是一个菜鸟,所以我为什么要问,毕竟。因为 [R=301] 是可以理解的,所以首先使用 https 规则会使所有后续无效 - 如果我删除它,并且满足列出的规则之一,它满足条件 - 但恢复为 http,完全无视 https 规则。我可以使用哪些其他工具,而不会在服务器上删除潜在的错误 .htaccess?否则,我必须检查浏览器内的方式,但我希望有更好的方式。
标签: .htaccess mod-rewrite