【问题标题】:optimizing Pretty URLs in .htaccess在 .htaccess 中优化漂亮的 URL
【发布时间】:2011-01-02 23:30:53
【问题描述】:

这是我使用的代码,

<IfModule mod_rewrite.c>
 RewriteCond %{SCRIPT_FILENAME} !-d
 RewriteCond %{SCRIPT_FILENAME} !-f
 RewriteRule ^([^/]+)/?([^/]+) index.php?user=$1&do=$2 [L]
</IfModule>

如果我给它abcd/1234,它将首先捕获abcd,然后将1234 作为第二个变量。但如果 url 是 abcd/abcd,第一个捕获保持不变,但第二个捕获变为 d。这不会对 php 代码本身造成任何问题,但如果一开始就没有捕获它会更有效。

澄清一下,index.php 页面不需要第一次或第二次捕获。但如果它们存在会改变它的目的。

对正则表达式代码的任何帮助将不胜感激,如果有任何改进或编写效率更高的方法,我将不胜感激!

非常感谢你:)
我使用这个工具http://gskinner.com/RegExr/ 来检查这个。

【问题讨论】:

    标签: regex apache .htaccess mod-rewrite friendly-url


    【解决方案1】:

    第二部分($2)是非可选的,因为你写了[^/]+。我会用^([^/]+)(?:/([^/]+))? 替换整个内容,这会导致以下结果:

    abcd -> $1='abcd' $2=''

    abcd/ -> $1='abcd' $2=''

    abcd/something -> $1='abcd' $2='something'

    【讨论】:

    • 您提供的正则表达式也有效!无论如何要知道在这种情况下,您的和 ^([^/]+)/?([^/]*) 哪个工作代码更有效?谢谢你的解释。
    • 我刚刚使用 Python 的 re 模块运行了一个测试(使用已编译的正则表达式,在“abcdefg/bam”之类的简短示例 URL 上进行 10000000 次匹配)。我的正则表达式耗时 54 秒,而 KiNgMaR 的正则表达式耗时 45 秒。有点预料到......因为两个正则表达式都是正确的,你应该使用更快的一个;)
    • 这是一个了不起的测试 AndiDog,感谢您的努力和澄清,非常感谢!
    • 没问题。其实我也对性能结果很好奇;)
    【解决方案2】:

    很简单的修改:

     ^([^/]+)/?([^/]*)
    

    【讨论】:

    • 工作 :D 你看到代码改进的空间了吗?你知道为什么前面的代码只会捕获 d 吗?谢谢!
    【解决方案3】:

    规则中的问号和第二个加号导致它以这种方式拆分。您应该删除问号,因为您已经需要第二组中的至少一个字符。

    编辑: 在这种情况下,使用这个:

    RewriteRule ^([^/]+)(/([^/]+))?$ index.php?user=$1&do=$3 [L]
    

    【讨论】:

    • 我会检查的!只是为了明确第一次或第二次捕获都不是必需的,谢谢你:)
    猜你喜欢
    • 1970-01-01
    • 2023-02-26
    • 2015-05-16
    • 2014-09-24
    • 2019-02-27
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多