【问题标题】:Rewrite Rule with first and/or second subdirectory使用第一个和/或第二个子目录重写规则
【发布时间】:2013-08-16 17:58:54
【问题描述】:

我希望这些 URL 有效...

example.com/

example.com/results/

example.com/results/live/

example.com/results/live/123

example.com/results/ended/

live、ended 等总是按字母顺序排列

123 永远是数字(页码值)

我想要做的是将一个 php 文件放入 /results/ 并将“live”和“123”作为两个变量传递。我可以让它工作,但如果我省略“/123”,那么我也希望“/live”继续工作。问题是该目录不存在且不包含两个变量,因此被拒绝。我已经尝试过链接,但无法让它发挥作用。

一个简化的 htaccess 文件如下所示

<IfModule mod_rewrite.c>
RewriteEngine OnRewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^results/([A-Za-z]+)/([0-9]+)/?$ /results/index.php?format=$1&pagenum=$2 [L]
</IfModule>
Options All -Indexes
ErrorDocument 404 /errors/404

我曾尝试使用“-”而不是目录分隔符,同样的问题

本质上,我对当前处理任何丢失的文件或文件夹的方式感到满意,但我想为此目录创建一个例外

如果我不明白这一点,另一个冗长的选择是在“/results/”中使用自己的 php 文件创建实际的子目录,并将分页作为一个变量进行管理。

任何指针?

【问题讨论】:

    标签: .htaccess mod-rewrite


    【解决方案1】:

    试试这个:

    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^results/([A-Za-z]+)/?(?:([0-9]+)/?|)$ /results/index.php?format=$1&pagenum=$2 [L]
    

    (?:([0-9]+)/?|) 是有条件的前瞻。它使最后一部分(例如/1234)成为可选的。如果不存在,pagenum 将为空白。

    【讨论】:

    • 干得好——行得通!你知道如何使尾部斜线可选,以便 example.com/results/live 与 example.com/results/live/ 一样工作
    • @Quotes 在斜线后添加?^results/([A-Za-z]+)/?(?:([0-9]+)/?|)
    • 不幸的是,在 example.com/results/live 和 example.com/results/live/ 上会生成 500 内部服务器错误,但其他 URL 似乎仍在工作
    • 只是一个想法(我不知道怎么做),但尾部斜杠可以进入条件前瞻吗?
    • @Quotes 只要有/results/index.php 文件,它就可以正常工作。否则它会循环。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 2012-04-30
    • 2022-01-03
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多