【问题标题】:Using more than one friendly url with Mod_Rewrite对 Mod_Rewrite 使用多个友好的 url
【发布时间】:2017-04-09 02:25:00
【问题描述】:

我能够使用此代码使网址正常工作

RewriteRule ^(.*)/([^/\.]+)/?$ $1/index.shtml?dynContent=$2 [L]

所以 dynContent = 苹果或香蕉或香蕉苹果

因此,如果我输入 http://example.com/dir1/apples 或 /dir1/bananas 或 /dir1/bananas-apples,它将使用我拉入 index.shtml 的正确内容显示

但是我有一页需要整页,我有一页配置为整页,它被命名为 indexFP.shtml

这一页的 dynContent=oranges

我有 RewriteRule 作为

RewriteRule ^(.*)/([^/\.]+)/?$ $1/indexFP.shtml?dynContent=$2 [L]

但这并没有为这一页调出正确的页面和整页.....

当我输入 http://example.com/dir1/oranges 时,它使用 index.shtml 而不是 indexFP.shtml

有没有办法做到这一点?这是我现在所拥有的。

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/([^/\.]+)/?$ $1/index.shtml?dynContent=$2 [L]
RewriteRule ^(.*)/([^/\.]+)/?$ $1/indexFP.shtml?dynContent=$2 [L]

有什么建议吗?

【问题讨论】:

    标签: apache .htaccess url mod-rewrite


    【解决方案1】:

    [L] 在 mod_rewrite 中表示“最后一个”。这将停止处理,因此您上面的 indexFP 规则将永远不会受到影响。

    我认为您尝试做的是为某些字符串选择index,为其他字符串选择indexFP。为此,您需要一种方法来选择一个规则而不是另一个规则。我的 rewrite-fu 有点生疏,但类似于:

    # match "oranges"
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} /oranges/
    RewriteRule ^(.*)/([^/\.]+)/?$ $1/indexFP.shtml?dynContent=$2 [L]
    
    # match everything else
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/([^/\.]+)/?$ $1/index.shtml?dynContent=$2 [L]
    

    【讨论】:

    • 哇……好用!有没有办法让这更加动态?我只是在想这是特定于橙子的……假设是苹果?只是想找出一种方法可以做到这一点,而不必在此处输入每个,也不必每次都重新启动 apache。
    • 我想我能够从你的例子中弄清楚。 # match "oranges" RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} /(.*)FP/? RewriteRule ^(.*)/([^/\.]+)/?$ $1/indexFP.shtml?dynContent=$2 [L] # 匹配其他所有内容 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !- d RewriteRule ^(.*)/([^/\.]+)/?$ $1/index.shtml?dynContent=$2 [L]
    • 对于动态查找,请使用 RewriteMap。它会在文件被修改时自动重新加载地图文件,因此您不必重新加载 Apache。 RewriteMap 还允许您使用单个规则集,而不是上面的“if-else”构造。
    • 你有什么好的参考资料可以看看吗?或者你可以推荐一个好的教程?
    • 主要的 Apache 文档很好地描述了这些指令。有一个链接指向他们所谓的“详细”文档,其中包括大量用例和示例。请参阅:httpd.apache.org/docs/current/rewrite 编辑:我还发现打开重写调试日志对于查看重写的各个阶段并验证您的规则是否正在运行非常有帮助。调试日志在高级别非常详细,因此仅在测试中使用它。我想我用的是 5 级,但 YMMV。
    猜你喜欢
    • 2011-01-04
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 2012-12-29
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多