【问题标题】:Apply htaccess rules for all cases except a few对除少数情况外的所有情况应用 htaccess 规则
【发布时间】:2017-12-12 02:20:49
【问题描述】:

我希望每次访问:

www.example.com/demo/action.html

重定向到

www.example.com/demo/?section=action

成为action 变化的变量。 但是,我不想在某些情况下应用该规则,比如说:

www.example.com/demo/mypage1.html
www.example.com/demo/mypage2.html 

对于这些情况,我希望他们加载真正的 html 页面 mypage1.htmlmypage2.html

目前我为所有可能的action 变量设置了 20 条规则。但由于它在性能方面似乎并不理想,我宁愿只使用 2 种特殊情况和所有其他情况的单一规则。

这是我目前拥有的:

RewriteRule ^demo/removeUser.html$ demo/?section=removeUser [QSA]
RewriteRule ^demo/addUser.html$ demo/?section=addUser[QSA]
RewriteRule ^demo/addUser.html$ demo/?section=editUser[QSA]
RewriteRule ^demo/addUser.html$ demo/?section=comment[QSA]
... etc

【问题讨论】:

    标签: .htaccess mod-rewrite url-rewriting


    【解决方案1】:

    您可以将异常放在顶部,然后是通用的重写规则:

    RewriteEngine On
    
    RewriteRule ^demo/(?:mypage1|mypage2)\.html$ - [L,NC]
    
    RewriteRule ^demo/([\w-]+)\.html$ demo/?section=$1 [QSA,L,NC]
    

    这假设demo/ 目录里面没有.htaccess。

    但是,如果您只是想从这次重写中排除所有现有文件,那么您只需一条这样的规则:

    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^demo/([\w-]+)\.html$ demo/?section=$1 [QSA,L,NC]
    

    【讨论】:

    • 感谢您的回答。但是如果我有 10 或 12 个特殊情况怎么办?那将是一条很长的线。那会是最好的方法吗?还是更好地为每个特殊情况定义规则?
    • 即使对于 11/12 的特殊情况,将它们全部放在一个规则中也可以。但是如果你有太多的特殊情况,那么你可以分解为多个例外规则。
    • 我想知道...我不能使用RewriteCond %{REQUEST_FILENAME} -f 之类的东西,这样我就可以避免为确实存在的文件编写重写规则了吗? “特殊情况”?
    • 您只想排除所有现有文件吗?换句话说,这是否意味着demo/mypage1.htmldemo/mypage2.html 是现有文件但demo/action.html 不是?
    • 正是 :) 就是这样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多