【问题标题】:mod_rewrite rules for clean URLs with optional parameters带有可选参数的干净 URL 的 mod_rewrite 规则
【发布时间】:2013-03-22 01:31:57
【问题描述】:

我有当前网址:

http://domain.com

当您访问此 URL 时,默认会加载:

http://domain.com/index.php

在我的 .htaccess 中,我有:

Options +FollowSymLinks
RewriteEngine On
RewriteRule ^([^/]*)$ /index.php?var1=$1 [L]
RewriteRule ^([^/]*)/([^/]*)$ /index.php?var1=$1&var2=$2 [L]
RewriteRule ^([^/]*)/([^/]*)/([^/]*)$ /index.php?var1=$1&var2=$2&var3=$3 [L]
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)$ /index.php?var1=$1&var2=$2&var3=$3&var4=$4 [L]
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)$ /index.php?var1=$1&var2=$2&var3=$3&var4=$4&var5=$5 [L]

.htaccess 为所有页面提供 404,所以我确定它是错误的。

我希望能够让以下所有 URLS 工作

http://domian.com/val1/
http://domian.com/val1/val2/
http://domian.com/val1/val2/val3
http://domian.com/val1/val2/val3/val4/
http://domian.com/val1/val2/val3/val4/val5

表示它们是可选参数

我做错了什么?如何设置 .htaccess 以接受可选参数。

编辑:我在原来的问题中有很多问题,所以我把它变成了一个更容易理解的问题。希望我能得到答案。

【问题讨论】:

    标签: .htaccess mod-rewrite apache2


    【解决方案1】:

    好吧,经过一番反复试验,我找到了答案:

    Options +FollowSymLinks
    RewriteEngine On
    RewriteRule ^([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)$ index.php?word=$1&media=$2&date=$3&sortby=$4&source=$5 [L]
    RewriteRule ^([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)$ index.php?word=$1&media=$2&date=$3&sortby=$4 [L]
    RewriteRule ^([\w-]+)/([\w-]+)/([\w-]+)$ index.php?word=$1&media=$2&date=$3 [L]
    RewriteRule ^([\w-]+)/([\w-]+)$ index.php?word=$1&media=$2 [L]
    RewriteRule ^([\w-]+)$ index.php?word=$1 [L]
    

    这让我得到了我正在寻找的结果。但是,如果最后有斜线,我会得到 404 示例:

    http://domain.com/val1/
    

    但是给出 404

    http://domain.com/val1
    

    按预期工作。怎么会?

    编辑: 用于尾随斜杠的 faa 解决方案有效。最终规则如下所示:

    Options +FollowSymLinks
    RewriteEngine On
    RewriteRule ^([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/?$ index.php?var1=$1&var2=$2&var3=$3&var4=$4&var5=$5 [L]
    RewriteRule ^([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/?$ index.php?var1=$1&var2=$2&var3=$3&var4=$4 [L]
    RewriteRule ^([\w-]+)/([\w-]+)/([\w-]+)/?$ index.php?var1=$1&var2=$2&var3=$3 [L]
    RewriteRule ^([\w-]+)/([\w-]+)/?$ index.php?var1=$1&var2=$2 [L]
    RewriteRule ^([\w-]+)/?$ index.php?var1=$1 [L]
    

    【讨论】:

    • 测试我的答案。 http://domain.com/val1/ 不适用于您的规则的原因,在此处进行了解释和更正。您需要在正则表达式中添加一个可选的斜杠。喜欢这个/?$。一切尽在我的回答中。
    • 您的回答给了我一个内部服务器错误。您的尾部斜杠解决方案就像一个魅力。谢谢
    • 我猜这是因为您原始问题中的规则顺序不同。不过,我没有测试它们。只是想指出错误的原因。
    • 您的回答很有帮助。再次感谢
    【解决方案2】:

    某些请求示例中的尾部斜杠与规则中的正则表达式不匹配。

    你可以试试这个:

    Options +FollowSymlinks -MultiViews
    RewriteEngine On
    RewriteRule ^([^/]+)/?$ /index.php?var1=$1 [L,NC]
    RewriteRule ^([^/]+)/([^/]+)/?$ /index.php?var1=$1&var2=$2 [L,NC]
    RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ /index.php?var1=$1&var2=$2&var3=$3 [L,NC]
    RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/?$ /index.php?var1=$1&var2=$2&var3=$3&var4=$4 [L,NC]
    RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/?$ /index.php?var1=$1&var2=$2&var3=$3&var4=$4&var5=$5 [L,NC]
    

    【讨论】:

    • 您好,谢谢您的回答。我发布了对我有用的答案。添加 NC 会解决我遇到的新问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    相关资源
    最近更新 更多