regex - htaccess 用一个斜线替换所有斜线(两个和更多)
问题描述
我想修改一个 .htaccess 文件来做两件事:
- 强制在每个 URL 的末尾添加斜杠
- 用 1 个单斜杠替换多余的斜杠(2 个或更多)。
这是一组 URL 及其预期结果:
https://www.mywebsite.io/fr > https://www.mywebsite.io/fr/
https://www.mywebsite.io/fr/register > https://www.mywebsite.io/fr/register/
https://www.mywebsite.io/fr/register// > https://www.mywebsite.io/fr/register/
https://www.mywebsite.io/fr////register > https://www.mywebsite.io/fr/register/
https://www.mywebsite.io/fr/register///other////// > https://www.mywebsite.io/fr/register/other/
我设法做了第一步,即强制使用最终的 /,但我无法替换额外的 /。
你能帮我解决这个问题吗?
这是我的 .htaccess 文件的内容
Options +FollowSymlinks
RewriteEngine On
## Force HTTPS
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI}/$1 [L,R]
## Force slash
RewriteCond %{REQUEST_URI} /+[^\.]+$
RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [L,R]
## Remove repeated slashs
#RewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$ [N]
#RewriteRule (.*) %1 [R,L]
RewriteRule (.*)/{2,}(.*) $1/$2 [N]
RewriteRule ^(fr|en){1}(/?)$ content/index.php?lang=$1 [L]
RewriteRule ^(fr|en){1}(/){1}(registration){1}(/?)$ content/registration.php?lang=$1 [L]
解决方案
像这样:(见内联评论)
Options +FollowSymlinks
RewriteEngine On
## add https and trailing slash in same rule
RewriteCond %{HTTPS} !on [OR]
RewriteCond %{REQUEST_URI} !/$
RewriteRule ^(.*?)/?$ https://%{HTTP_HOST}/$1/ [R=301,L,NE]
## Remove repeated slashs
RewriteCond %{THE_REQUEST} \s[^?]*//
RewriteRule ^.*$ /$0 [R=301,L,NE]
RewriteRule ^(fr|en)/?$ content/index.php?lang=$1 [L,QSA]
RewriteRule ^(fr|en)/registration/?$ content/registration.php?lang=$1 [L,QSA]
推荐阅读
- xaml - 网格如何知道何时重新布局?
- c++ - 在我看来好像 std::getline 不能正确处理新行?
- django - Django 自动将 csrftoken 附加到由 React Native 请求发送的 cookie 中
- node.js - mongodb 如何处理来自辅助节点的读取?
- python - 在python中,使用xml,只有当另一个值存在时,我才能更改一个值
- reactjs - 使用 React 的 Jest 测试失败
- qt - 动态创建一个类型的 QML 对象
- python-2.x - 在 Python 中动态创建 u-strings
- javascript - Babel 会填充现有但不完全符合目标标准的旧功能吗?
- java - Java ProcessHandle.Info.totalCpuDuration() 返回的数据很少