.htaccess 使用htaccess将具有id范围的url重定向到另一个url

hgtggwj0  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(169)

我尝试重定向用户从Joomla插件链接,具有特定的ID到默认的管理页面,如下:
当用户登录Joomla后端,他可以到达这个页面的插件:

https://www.example.com/administrator/index.php?option=com_plugins

然后,如果他想打开一个插件与id如422编辑它,他点击这个链接:

https://www.example.com/administrator/index.php?option=com_plugins&task=plugin.edit&extension_id=422

但我不想打开插件,我希望用户被重定向到这个页面:

https://www.example.com/administrator/index.php

为了实现这一点,我在文件夹administrator中创建了一个.htaccess,并将代码放在最后。因此,我设置了一个插件的ID范围,用户不能编辑,但会被重定向。请找到.htaccess文件的所有内容如下:

# Canonical https/www
<IfModule mod_rewrite.c>
    RewriteCond %{HTTPS} off
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    
    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule (.*) https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>

# Redirect plug id from 350 to 423:
RewriteCond %{HTTP_HOST} ^www\.example\.com$
RewriteCond %{QUERY_STRING} (^|&)option\=com_plugins($|&)
RewriteCond %{QUERY_STRING} (^|&)extension_id=\b(3[5-8][0-9]|39[0-9]|4[01][0-9]|42[0-3])\b($|&)
RewriteRule ^administrator/index\.php$ https://www.example.com/administrator/index.php? [L,R=302]

# Redirect plug id from 425 to 10864:
RewriteCond %{HTTP_HOST} ^www\.example\.com$
RewriteCond %{QUERY_STRING} (^|&)option\=com_plugins($|&)
RewriteCond %{QUERY_STRING} (^|&)extension_id=\b(42[5-9]|4[3-9][0-9]|[5-9][0-9]{2}|[1-8][0-9]{3}|9[0-8][0-9]{2}|99[0-8][0-9]|999[0-9]|10[0-7][0-9]{2}|108[0-5][0-9]|1086[0-4])\b($|&)
RewriteRule ^administrator/index\.php$ https://www.example.com/administrator/index.php? [L,R=302]

但是不管用。

8wtpewkr

8wtpewkr1#

我在文件夹administrator中创建了一个.htaccess,并将代码放在末尾。

# Redirect plug id from 350 to 423:
RewriteCond %{HTTP_HOST} ^www\.example\.com$
RewriteCond %{QUERY_STRING} (^|&)option\=com_plugins($|&)
RewriteCond %{QUERY_STRING} (^|&)extension_id=\b(3[5-8][0-9]|39[0-9]|4[01][0-9]|42[0-3])\b($|&)
RewriteRule ^administrator/index\.php$ https://www.example.com/administrator/index.php? [L,R=302]

如果.htaccess文件位于/administrator子目录中,则需要从RewriteRulepattern(第一个参数)的开头删除administrator/,否则规则将永远不匹配。
.htaccess中,RewriteRule * 模式 * 与包含.htaccess文件的目录的相对URL路径匹配。
换句话说,它应该如下所示:

:
RewriteRule ^index\.php$ https://www.example.com/administrator/index.php [QSD,R=302,L]

此外,在Apache 2.4上,您可以使用QSD(Query String Discard)标志来删除原始查询字符串,而不是附加一个空查询字符串。
匹配查询字符串和插件ID的前面的 conditions 是正确的,并且应该匹配请求的URL。(尽管单词boundary \b元素是不必要的。)
根据您拥有的其他指令,该规则应该位于.htaccess文件的顶部,而不是“末尾”。由于您使用了绝对 * 替换 * 字符串,因此最好将这些规则包含在常规规范重定向 * 之前 *(尽管这确实假设您没有实现HSTS)。
您还缺少相关规则中的RewriteEngine On指令。
因此,它应该如下所示:

RewriteEngine On

# Redirect plug id from 350 to 423:
RewriteCond %{HTTP_HOST} ^www\.example\.com$
RewriteCond %{QUERY_STRING} (^|&)option\=com_plugins($|&)
RewriteCond %{QUERY_STRING} (^|&)extension_id=(3[5-8][0-9]|39[0-9]|4[01][0-9]|42[0-3])($|&)
RewriteRule ^index\.php$ https://www.example.com/administrator/index.php? [QSD,R=302,L]

# Redirect plug id from 425 to 10864:
RewriteCond %{HTTP_HOST} ^www\.example\.com$
RewriteCond %{QUERY_STRING} (^|&)option\=com_plugins($|&)
RewriteCond %{QUERY_STRING} (^|&)extension_id=(42[5-9]|4[3-9][0-9]|[5-9][0-9]{2}|[1-8][0-9]{3}|9[0-8][0-9]{2}|99[0-8][0-9]|999[0-9]|10[0-7][0-9]{2}|108[0-5][0-9]|1086[0-4])($|&)
RewriteRule ^index\.php$ https://www.example.com/administrator/index.php [QSD,R=302,L]

# Canonical https/www
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

其他注意事项:
1.我假设您还没有实现HSTS
1.我颠倒了两个规范重定向的顺序,以减少请求http://example.com/(HTTP + non-www)时重定向的数量。
1.优化了规范重定向上的正则表达式...当使用REQUEST_URI服务器变量时,无需遍历和捕获整个URL路径。
1.从正则表达式中删除了单词boundary \b,因为这在这里似乎是不必要的。

相关问题