在我的htaccess中有以下内容:
RewriteEngine On
RewriteRule ^reset-password/?$ /pwreset.php [NC,L]它工作得很好,问题是当PHP文件被直接访问时,它是否也可以自动重定向到新路径?
例如:example.com/pwreset.php >> example.com/reset-password
有几页,所以我需要一些实用的东西。
更新:
RewriteRule .* - [E=URL:https://user.example.com]
RewriteRule ^pwreset\.php$ %{ENV:URL}/reset-password [R=301,L]
RewriteRule ^reset-password$ pwreset.php [END]
RewriteRule ^clientarea\.php$ %{ENV:URL}/home [R=301,L]
RewriteRule ^home$ clientarea.php [END]
RewriteRule ^logout\.php$ %{ENV:URL}/logout [R=301,L]
RewriteRule ^logout$ logout.php [END]困难在于这样的链接:user.example.com/clientarea.php?action=services
当访问时,它重定向到:user.example.com/home?action=services
在这些链接的情况下,我需要重定向到:user.example.com/services
你能帮我制定这条新规定吗?以及如何简化这一切。
发布于 2020-09-30 01:35:54
要将对/pwreset.php的请求外部重定向到/reset-password,可以在现有的内部重写之前执行如下操作:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^pwreset\.php$ /reset-password [R=301,L]检查REDIRECT_STATUS env的条件是必要的,以避免重定向循环,因为我们只想重定向用户已经发出的请求,而不是通过另一个指令重写请求。REDIRECT_STATUS在初始请求中为空,并在第一次成功重写后设置为" 200“(如200 OK)。
首先使用302 (临时)重定向进行测试,以避免潜在的缓存问题。
UPDATE#1:,有没有办法把它放在同样的规则中?因为有很多页,所以我不得不重复每一行。
不,如果您使用的是单个.htaccess文件,并且希望通过.htaccess执行所有操作,则需要对每个外部重定向重复这两个指令(RewriteCond和RewriteRule)。如果没有RewriteCond指令(条件),重写的请求也会被重定向--创建一个无穷无尽的循环。
但是,您可以使用子目录中的第二个.htaccess文件来处理重定向。这将避免每条规则的附加条件。
例如,没有像上面解释的那样重定向pwreset.php。您可以在内部将对.php文件的所有请求(假设您没有直接访问任何.php文件)重写到包含另一个具有必要重定向的.htaccess的子目录中。
将上面的重定向更改为表单的重写:将所有对.php文件的直接请求重写到子目录RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteRule (.+.php)$ /重定向-处理程序/$1 LWhere /redirect-handler是一个物理
/redirect-handler/.htaccess:将对.php文件的直接请求重定向到规范URL。#如果我们在这里,那么我们知道.php文件已经被直接调用了#,所以在每个规则之前不需要附加条件。RewriteEngine On RewriteRule ^pwreset.php$ /reset-密码R=301,L RewriteRule ^another.php$ /规范化-url R=301,L另一种选择是将请求重写到PHP脚本,而不是包含另一个.htaccess文件的子目录,而是在PHP中执行重定向。
例如,初始的“重定向”变成:
# Rewrite all direct requests for `.php` files to PHP script
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_URI} !^/redirect-handler\.php$
RewriteRule (.+\.php)$ /redirect-handler.php?url=$1 [L]然后,在/redirect-handler.php中,您将检查请求的$_GET['url']文件的$_GET['url']变量。(或者只需检查$_SERVER['REQUEST_URI']超级全局。)查找所需的规范URL,如果请求映射到有效的URL,则查找301“重定向”,或者返回404。
您可以更进一步,并在一个脚本中管理PHP中的所有内容。这有一个明显的优点,就是只有一个列表(PHP数组或DB表)包含PHP文件/规范-url映射。除了.htaccess中的初始重写之外,在添加/删除/更新URL时,不需要更新.htaccess。尽管您可能需要修改现有的页面,但这取决于您如何包含文件等(?)
UPDATE#2:使用单个.htaccess文件的..。如果您在Apache2.4上(而不是2.2),那么您只需在内部重写上使用END标志(而不是L标志),这将避免在“重定向”上指定附加条件(RewriteCond指令)。
例如:
RewriteEngine On
# Canonical redirects...
RewriteRule ^pwreset\.php$ /reset-password [R=301,L]
:
# Internal rewrites...
RewriteRule ^reset-password$ pwreset.php [END]
:与L标志不同,END标志停止所有处理,从而防止重写引擎重新启动。
请注意,我对您最初的重写做了一些小改动..。
NC标志--真的需要不区分大小写的匹配吗?否则,可能会产生重复的内容问题,但您应该始终链接到单个规范URL。RewriteRule模式上可选的拖尾斜杠。(与above.)RewriteRule替换字符串上的斜杠前缀-它不是必需的,并且简化了重写(它现在重写到文件系统路径--这就是它是什么--而不是URL-路径)。这比上面列出的方法简单得多!(尽管这些方法仍有其目的。)
https://stackoverflow.com/questions/64128196
复制相似问题