我的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
则需要为每个外部重定向重复两个指令(RewriteCond
和RewriteRule
)。没有RewriteCond
指令(条件),重写的请求也将被重定向-创建一个无限循环。
但是,您可以.htaccess
在子目录中使用第二个文件来处理重定向。这将避免为每个规则附加条件。
例如,代替pwreset.php
如上所述的重定向。您可以在内部将所有对.php
文件的请求重写(假设您没有直接访问任何 .php
文件)到一个子目录,该子目录包含另一个.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
使用必要的重定向进行创建:
# 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] 删除。
我来说两句