【问题标题】:Simple Rewrite rule with optional slash带有可选斜杠的简单重写规则
【发布时间】:2023-04-07 09:52:01
【问题描述】:

我只需在我的 htaccess 中添加一个重写规则即可:

http://mysite/toto -> http://mysite/page.php?c=toto

同样的结果:

http://mysite/toto/ -> http://mysite/page.php?c=toto

我的 htaccess 文件:

Options +FollowSymlinks
RewriteEngine On
RewriteRule ^(.*)/?$  page.php?c=$1  [L]

它适用于 URL“http://mysite/toto

但没有 URL "http://mysite/toto/" --> 结果:http://mysite/page.php?c=toto/

如何解决这个问题?

【问题讨论】:

    标签: regex apache .htaccess rewrite rule


    【解决方案1】:

    好的,所以你遇到了“贪婪”匹配, .* 匹配所有内容。你可以做的是得到不是/的每个字符:

    ^([^/]).

    这说:

    1. 比赛开始^
    2. 匹配除 / 以外的任何字符 :[^/]
    3. 将第 2 步匹配引用为 $1 the parens do that

    这会做你想做的事。请注意,如果您必须转义 / 字符,则需要使用 /。我认为您不需要使用 htaccess 文件。

    【讨论】:

    • 我希望无论有无字符“/”的用户,结果都相同。
    • 好的,所以使用规则^(.*)$,这将捕获任何内容。
    • 我尝试过,但它对我不起作用。如果 url 为“mysite/toto/”,则结果为“mysite/page.php?c=toto/”。或者我想要“mysite/page.php?c=toto”
    【解决方案2】:

    好的,谢谢! 我试试这个,它看起来很管用!

    RewriteBase /
    RewriteRule ^(.*[^/])/?$ page.php?c=$1 [QSA,L]
    

    url= http://localhost/toto/ --> 结果= http://localhost/page.php?c=toto

    url= http://localhost/toto --> 结果= http://localhost/page.php?c=toto

    【讨论】:

    • 很好,但如果你有类似的东西:http://localhost/toto/vovo 它不会匹配你的正则表达式。基本上,网址末尾的 1 个斜杠之后的任何内容都会破坏它。
    • 没错,我做了改变。 RewriteRule ^sub/(.*)/([0-9]+)(.*)/?$ page.php?c=$1&id=$2 [QSA,L]RewriteRule ^sub/(.*[^/])/?$ page.php?c=$1 [QSA,L] 我需要 2 个参数。这很好用
    • 所以像http://localhost/sub/toto/2034/vovo这样的url匹配像http://localhost/page.php?c=toto&id=2034
    猜你喜欢
    • 1970-01-01
    • 2014-10-22
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多