【问题标题】:.htaccess ReWrites cancelling each other out ... Any Ideas?.htaccess 重写相互抵消......有什么想法吗?
【发布时间】:2019-02-01 10:38:20
【问题描述】:

我的 .htaccess 文件中有几条规则,以使 URL 更简洁,但是,它们似乎相互抵消了。

第一条规则就是去掉页面名称中的.php

示例:mysite.com/join 而不是 mysite.com/join.php

RewriteEngine On
Rewrite Condition : %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

第二条规则是让用户更容易在我的网站上分享他们的个人资料,

示例:mysite.com/user1 而不是实际的 URL mysite.com/profile.php?user=user1

RewriteRule ^([_A-Z0-9a-z-+]+)$ profile.php?user=$1 [S=1]

我一直在和它们玩,它们基本上相互抵消了 - 关于如何让它们都工作的任何想法?

谢谢

【问题讨论】:

    标签: php .htaccess url url-rewriting


    【解决方案1】:

    您遇到的问题是这两个条件几乎相同,即^([_A-Z0-9a-z-+]+)$ 匹配的任何内容也将由^([^.]+)$ 匹配,因此访问mysite.com/user1 的人将被重定向到mysite.com/user1.php,因为这是第一条规则遇到,并且它具有L 标志以防止处理更多规则。为了防止这种情况发生,您需要使规则不同,例如也许要求用户页面为mysite.com/users/user1?然后你可以把规则写成

    RewriteRule ^([^./]+)$ $1.php [NC,L]
    RewriteRule ^users/([_A-Z0-9a-z-+]+)$ profile.php?user=$1 [S=1]
    

    注意,第一条规则中不匹配的字符需要加上/,否则还是会匹配mysite.com/users/user1

    编辑

    其他几种选择:

    如果您愿意让操作(例如加入)使用诸如 mysite.com/action/join 之类的 URL,那么您可以将用户保持在顶级,例如

    RewriteRule ^action/([^.]+)$ $1.php [NC,L]
    RewriteRule ^([_A-Z0-9a-z-+]+)$ profile.php?user=$1 [S=1]
    

    或者,如果您知道所有操作的名称,则可以将它们交替排列(这将要求您不能拥有名为例如 join 的用户):

    RewriteRule ^(join|login|logout|delete)$ $1.php [NC,L]
    RewriteRule ^([_A-Z0-9a-z-+]+)$ profile.php?user=$1 [S=1]
    

    【讨论】:

    • 感谢您的回答尼克 - 我现在看到了这个问题,但是确实需要两者......并且基本上需要个人资料页面只是用户名,而不是在末尾附加一个数字,因为它'会为他们在社交媒体上分享他们的个人资料等。希望我能够解决这个问题/有人可以提供进一步的帮助吗?
    • 不确定您所说的appending a number to the end 是什么意思,例如,我只是建议它是mysite.com/users/Rrossco。无论如何,我在我的编辑中提供了另外几个可能对你有用的替代方案。
    • 啊,太棒了,谢谢尼克 - 对不起,我误解了你的第一条评论。您的第二个选项非常有效。我只有几个我/我的用户可以直接链接到的页面,即登录、加入等,所以现在这正是我所需要的!如果需要,我显然可以在该列表中添加更多页面,但任何人都不太可能使用这些名称创建帐户,因为他们是企业和商人。再次感谢 - 我现在更好地理解了这些规则。 R
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 2021-08-08
    • 2019-09-30
    • 1970-01-01
    • 2020-01-04
    相关资源
    最近更新 更多