如何解决使用htaccess自定义URL重写
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
您可以帮我这个新规则吗?还有如何简化这一切。
解决方法
要将外部/pwreset.php
的直接请求重定向到/reset-password
,可以在现有内部重写之前执行以下
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^pwreset\.php$ /reset-password [R=301,L]
为了避免重定向循环,必须检查REDIRECT_STATUS
env var的条件,因为我们只想重定向用户已发出的直接请求,而不能用另一个指令重写请求。 REDIRECT_STATUS
在初始请求中为空,并在首次成功重写后设置为“ 200”(如200 OK)。
首先使用302(临时)重定向进行测试,以避免潜在的缓存问题。
UPDATE#1:是否可以将其置于同一规则中?因为页面很多,所以实际上我必须重复每一行。
否,如果您使用的是单个.htaccess
文件,并且您想通过.htaccess
进行所有操作,则需要重复两个指令(RewriteCond
和RewriteRule
)进行外部重定向。如果没有RewriteCond
指令(条件),重写的请求也将被重定向-创建一个无限循环。
但是,您可以在子目录中使用第二个.htaccess
文件来处理重定向。这样可以避免为每个规则附加条件。
例如,代替如上所述的重定向pwreset.php
。您可以内部重写所有对.php
文件的请求(假设您没有直接访问任何 .php
文件)到包含另一个{{ 1}},并进行必要的重定向。
-
将上面的重定向更改为以下形式的重写:
.htaccess
# Rewrite all direct requests for `.php` files to a subdirectory RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteRule (.+\.php)$ /redirect-handler/$1 [L]
是物理子目录。 -
使用必要的重定向创建
/redirect-handler
:/redirect-handler/.htaccess
另一种替代方法是将请求重写为PHP脚本,而不是包含另一个# Redirect direct requests for .php files to the canonical URL.
# If we are here then we know that the .php file has been called directly
# so do not need an additional condition before each rule.
RewriteEngine On
RewriteRule ^pwreset\.php$ /reset-password [R=301,L]
RewriteRule ^another\.php$ /canonical-url [R=301,L]
文件的子目录,而是使用PHP执行重定向。
例如,您的初始“重定向”变为:
.htaccess
然后,在# 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
变量中是否包含所请求的PHP文件。 (或者只是检查$_GET['url']
超全局变量。)查找所需的规范URL,如果请求映射到有效URL或返回404,则返回301“重定向”。
您可以更进一步,并在一个脚本中管理PHP中的所有内容。这具有明显的优点,即您只有一个包含PHP文件/规范URL映射的列表(PHP assoc数组或DB表)。除了在$_SERVER['REQUEST_URI']
中进行的初始重写之外,在添加/删除/更新URL时,您无需更新.htaccess
。尽管您可能需要修改现有页面,但具体取决于您如何包含文件等。(?)
UPDATE#2::使用单个.htaccess
文件...如果您使用的是Apache 2.4(而不是2.2),则可以使用.htaccess
标志在内部重写上(而不是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
标志-您真的需要不区分大小写的匹配吗?否则,这可能会导致重复的内容问题,但是您应该始终链接到单个规范URL。 - 删除了
NC
模式上的可选斜杠。 (与上述原因相同。) - 删除了
RewriteRule
字符串上的斜杠前缀-它不是必需的,并且简化了重写(它现在重写为文件系统路径-就是它的名称-而不是URL -路径)。
这比上面概述的方法简单得多! (尽管这些方法仍然有其目的。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。