微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用htaccess自定义URL重写

如何解决使用htaccess自定义URL重写

我的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

您可以帮我这个新规则吗?还有如何简化这一切。

解决方法

要将外部/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进行所有操作,则需要重复两个指令(RewriteCondRewriteRule )进行外部重定向。如果没有RewriteCond指令(条件),重写的请求也将被重定向-创建一个无限循环。

但是,您可以在子目录中使用第二个.htaccess文件来处理重定向。这样可以避免为每个规则附加条件。

例如,代替如上所述的重定向pwreset.php。您可以内部重写所有对.php文件的请求(假设您没有直接访问任何 .php文件)到包含另一个{{ 1}},并进行必要的重定向。

  1. 将上面的重定向更改为以下形式的重写:

    .htaccess

    # Rewrite all direct requests for `.php` files to a subdirectory RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteRule (.+\.php)$ /redirect-handler/$1 [L] 是物理子目录。

  2. 使用必要的重定向创建/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 举报,一经查实,本站将立刻删除。