使用htaccess自定义URL重写

Zecaluis

我的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文件)到一个子目录,该子目录包含另一个.htaccess具有必要重定向的目录。

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

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

    /redirect-handler物理子目录在哪里

  2. /redirect-handler/.htaccess使用必要的重定向进行创建

    # 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文件的子目录,然后使用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']var中检查所请求的PHP文件。(或者只是检查$_SERVER['REQUEST_URI']超全局变量。)查找所需的规范URL,如果请求映射到有效URL或返回404,则返回301“重定向”。

您可以更进一步,并在一个脚本中管理PHP中的所有内容。这具有明显的优点,即您只有一个包含PHP文件/规范URL映射的列表(PHP assoc数组或DB表)。除了中的初始重写外,添加/删除/更新URL时.htaccess无需.htaccess更新。尽管您可能需要修改现有页面,但具体取决于您如何包含文件等。(?)


UPDATE#2:使用单个.htaccess文件...如果您使用的是Apache 2.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
  • 删除了RewriteRule 替换字符串上的斜杠前缀-这不是必需的,并且简化了重写操作(现在它重写为文件系统路径-就是这样-而不是URL路径)。

这比上面概述的方法简单得多!(尽管这些方法仍然有其目的。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章