首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用htaccess自定义URL重写

用htaccess自定义URL重写
EN

Stack Overflow用户
提问于 2020-09-29 21:58:31
回答 1查看 165关注 0票数 1

在我的htaccess中有以下内容:

代码语言:javascript
复制
RewriteEngine On
RewriteRule ^reset-password/?$ /pwreset.php [NC,L]

它工作得很好,问题是当PHP文件被直接访问时,它是否也可以自动重定向到新路径?

例如:example.com/pwreset.php >> example.com/reset-password

有几页,所以我需要一些实用的东西。

更新:

代码语言:javascript
复制
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

你能帮我制定这条新规定吗?以及如何简化这一切。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-30 01:35:54

要将对/pwreset.php的请求外部重定向到/reset-password,可以在现有的内部重写之前执行如下操作:

代码语言:javascript
复制
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执行所有操作,则需要对每个外部重定向重复这两个指令(RewriteCondRewriteRule)。如果没有RewriteCond指令(条件),重写的请求也会被重定向--创建一个无穷无尽的循环。

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

例如,没有像上面解释的那样重定向pwreset.php。您可以在内部将对.php文件的所有请求(假设您没有直接访问任何.php文件)重写到包含另一个具有必要重定向的.htaccess的子目录中。

将上面的重定向更改为表单的重写:将所有对.php文件的直接请求重写到子目录RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteRule (.+.php)$ /重定向-处理程序/$1 LWhere /redirect-handler是一个物理

  1. 使用必要的重定向创建/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中执行重定向。

例如,初始的“重定向”变成:

代码语言:javascript
复制
# 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指令)。

例如:

代码语言:javascript
复制
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.)
  • Removed相同的原因是,RewriteRule替换字符串上的斜杠前缀-它不是必需的,并且简化了重写(它现在重写到文件系统路径--这就是它是什么--而不是URL-路径)。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64128196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档