【问题标题】:Redirect via htaccess in php通过 php 中的 htaccess 重定向
【发布时间】:2017-07-26 14:18:54
【问题描述】:

我在 php 中遇到了一些重定向问题,我为此使用了 .htaccess 但没有成功 我所拥有的是以下 2 个网址:

http://localhost/PROJECT_NAME/USERNAME/348

http://localhost/PROJECT_NAME/USERNAME

我想要的是:

1) 如果请求来自

http://localhost/PROJECT_NAME/USERNAME/111

那么它应该去:

http://localhost/PROJECT_NAME/index.php

2) 如果请求来自

http://localhost/PROJECT_NAME/USERNAME

那么它应该去:

http://localhost/PROJECT_NAME/detail.php

我尝试了什么:

RewriteRule /(\w+)$ detail.php?id=$1 [L]
RewriteRule /(\w+)$ index.php [L]
RewriteRule /$ detail.php?id=$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !index.php
RewriteCond %{REQUEST_URI} !(.*)/$

在此之后没有成功,它适用于索引但不适用于详细信息页面,请帮助大家提前感谢您的时间

兰德尔

【问题讨论】:

    标签: php apache .htaccess mod-rewrite url-rewriting


    【解决方案1】:

    这里有几个问题。首先是匹配的顺序和特异性。

    首先,正则表达式学习者的一个大问题: \w(速记“单词”字符类)等价于 [A-Za-z0-9_]。 . .注意其中的数字和下划线!

    假设最后一个片段中的所有 ID 只是数字,并且用户名都是字母、数字和/或下划线的混合,您只需更改匹配顺序并使用\d(数字)字符类优先:

    RewriteRule /(\d+)$ index.php [L]
    RewriteRule /(\w+)$ detail.php?id=$1 [L]
    

    这应该涵盖你的两个例子。

    您没有概述第三条规则的用例,因此我不确定您将其应用于哪些 URL 或需要如何更改。不过,这里有一些观察:

    1. 您应该将RewriteCond放在它们适用的RewriteRule 之前。 (请记住,实际上是先检查重写规则的表达式,然后检查条件。)
    2. 现在,RewriteRule 表达式将匹配任何以斜杠结尾但不是真实文件的内容。
    3. 同时检查它不是 index.php 对于!-f 是多余的。并且由于您匹配的是尾部斜杠,因此您实际上可能想使用 !-d 检查它是否不是目录(相对于文件)
    4. RewriteCond 表达式试图在否定表达式中进行捕获(因此它永远不会捕获任何内容,或者因为有效的表达式与规则中的表达式相同,所以它永远不会匹配,/$

    如果您试图在上面的用户名上允许尾部斜杠,您可以添加到已经存在的内容:

    RewriteRule /(\d+)$ index.php [L]
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule /(\w+)/?$ detail.php?id=$1 [L]
    

    如果您对第三条规则的用例有所不同,或者如果这些 RewriteCond 表达式适用于您粘贴的规则下方的不同规则,请随时使用详细信息编辑问题,我可以更新我的答案以解决该问题情况也是如此。

    【讨论】:

    • 非常感谢您的回复。我尝试了上述选项,但没有成功,主要问题在于以下网址:localhost/PROJECT_NAME/USERNAME 它没有重定向到“detail.php”页面
    • @RandheerSinghChouhan 一些事情: 1. 其他规则是否正常工作?如果不是,RewriteEngine On 是否出现在这些行之前? 2.你尝试了上面的哪个版本的代码? 3. 这个.htaccess 文件位于哪个路径?此外,使用这些规则的浏览器内不应发生重定向——它们的目的是重写请求以在 Apache 中指向预期的文件(对用户透明)。如果要发出客户端重定向(例如响应代码 301 或 302),则需要相应地使用 [R][R=301] 标志。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多