htaccess mod_rewrite问题

时间:2011-07-13 09:42:43

标签: .htaccess mod-rewrite

我是使用.htaccess文件的新手,所以我遇到了一些错误:

具体来说,我的mod_rewrite尝试有三个问题。

我需要它能够解析有限的域名,例如mydomain.com/user,并将其作为mydomain.com/elements/scripts/view/?pth=usermydomain.com/user/register-new吐出为mydomain.com/elements/scripts/view/?pth=user&ext=register-new

我目前有:

RewriteRule ^/([A-Za-z0-9]+)/(.*)$ /elements/scripts/view?pth=$1&ext=$2 [NC,L]

我不确定这是否有效,因为似乎没有触发L标志,并且它会重写它,然后由于某种原因再次使用pth=elements&ext=scripts/view重写它。 / p>

我遇到的另一个问题是我能够知道它是如何被重写的。我希望mod_rewrite对用户不可见(浏览器仍显示mydomain.com/user),但它当前将浏览器URL更改为RewriteRule替换。

非常感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:0)

请尝试使用此选项:

RewriteRule ^user/?(([^/]+)/?)?$ /elements/scripts/view?pth=user&ext=$2 [QSA,NC,L]
  1. 您的规则是一种广泛的方式..它会重写为另一个非固定目标网址(不是/index.php或类似的东西 - 我无法判断/elements/scripts/view是否是真实文件......或其他“虚拟”路径。

  2. 由于您需要只使用/user路径的网址,因此我已将其硬编码为规则 - 这会使规则更具体。

  3. 此规则需要放在网站根文件夹中的 .htaccess 中。对于任何其他位置,它需要一些小的修改。

  4. 将规则放在适当的位置 - 规则的顺序很重要


  5. “我不确定这是否有效,因为似乎没有触发L标志,它会重写它,然后再次使用pth=elements&ext=scripts/view重写它某种原因。“

    在Apache看到[L]标志后,它会停止进一步重写(当然,如果规则匹配)并转到下一次迭代开始从开始检查所有规则 - 这是它的工作方式和很多人似乎都没有意识到这一点。

    您可能有一些其他规则可能会产生此类行为。但很可能它是由您当前的规则完成的 - 您拥有的模式(正则表达式)非常广泛,可以捕获已经重写的URL(/elements/scripts/view)并再次重写(模式匹配)。


    <强>更新 根据您提供的其他信息,可以使用这些规则(1条规则匹配所有规则):

    Options +FollowSymLinks -MultiViews
    
    RewriteEngine On
    RewriteBase /
    
    # Do not do anything for already existing files
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule .+ - [L]
    
    RewriteRule ^([a-z0-9]+)(/?(.*))$ /elements/scripts/view/index.php?pth=$1&ext=$3 [QSA,NC,L]
    
    1. 这些规则不会重写对现有文件的请求(例如css / jpg / js文件)。

    2. 当对此类网址mydomain.com/user/register-new发出请求时,会将其重写为 /elements/scripts/view/index.php?pth=user&ext=register-new并重写进入下一次迭代。在下一次迭代中,规则#1将告诉Apache停止重写..因为/elements/scripts/view/index.php文件确实存在。完成工作。

    3. 如果由于某些原因上述情况不佳(例如,您仍需要重写对物理现有文件的请求并动态提供它们),请改用:

      Options +FollowSymLinks -MultiViews
      
      RewriteEngine On
      RewriteBase /
      
      RewriteCond %{REQUEST_URI} !^/elements/scripts/view/index.php [NC]
      RewriteRule ^([a-z0-9]+)(/?(.*))$ /elements/scripts/view/index.php?pth=$1&ext=$3 [QSA,NC,L]
      

      RewriteCond告诉Apache如果已经指向/elements/scripts/view/index.php,则不要重写URL。如果匹配模式,则可以重写任何其他URL。


      请记住,因为我不知道您可能拥有的所有可能的网址(您的网址结构),所以 模式可能需要进行一些调整。