【问题标题】:Cannot undertand the mixed outcomes of an .htaccess re-write rule / regex无法理解 .htaccess 重写规则/正则表达式的混合结果
【发布时间】:2013-12-19 10:37:01
【问题描述】:

我有一个简单的网站,其中包含一个带有 div 的页面,该页面根据用户选择的链接填充了 ajax 内容。该站点在 Apache 服务器上运行,在域的根目录中具有 .htaccess 文件。对 www.mydomain.com 的请求被定向到 scripts/index.php,而对动态内容(但不是资源文件)的请求被定向到同一个 .php 脚本,请求的内容作为参数传递(例如 www.mydomain.com /myProject 将被重写为 scripts/index.php?dynContent=myProject)。

我的重写规则如下,并且在大多数情况下,它们正确地执行了这些描述的任务;但是,我遇到了一些与第二个条件不匹配的 URL,尽管我希望它们会 - 尽管这是我第一次必须为 .htaccess 文件编写规则,所以我真的不知道是什么我在谈论... 一个不符合第二个条件的 URL 的一个很好的例子是 www.mydomain.com/about,但我只是通过测试随机单词/字母遇到了更多。

你能告诉我为什么 www.mydomain.com/about 不符合第二个条件吗?此外,如果有更优雅的方式来实现我上面描述的目标,我很想了解它。谢谢!!

RewriteCond %{HTTP_HOST} ^(www.)?mydomain.com$ [NC]
RewriteRule ^(/)?$ scripts/index.php [L]

RewriteCond %{REQUEST_URI} .*[^index.php|.css|.js|.jpg|.html|.swf]$
RewriteRule .* scripts/index.php?dynContent=$1 [L]

【问题讨论】:

    标签: regex apache .htaccess mod-rewrite


    【解决方案1】:

    这是因为您的第二条规则中的正则表达式不正确。

    将您的代码更改为:

    RewriteCond %{HTTP_HOST} ^(www\.)?mydomain\.com$ [NC]
    RewriteRule ^(/)?$ scripts/index.php [L]
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_URI} !\.(php|css|js|jpe?g|html|swf)$
    RewriteRule ^(.*)$ scripts/index.php?dynContent=$1 [L]
    

    【讨论】:

    • Anubhava,我尝试了您的解决方案,但没有立即成功。我最终将我的原始解决方案与您的解决方案混合在一起,这似乎效果很好。
    • 好的,您能否发布您的最终代码,以便我可以验证并提出相应的建议。
    • 在这里。我达到了 5 分钟的评论编辑限制... RewriteCond %{REQUEST_URI} !\.(php|css|js|jpe?g|html|swf)$ RewriteRule (.*) scripts/index.php?dynContent=$1 [L] 因为规则 #1 会将 www.mydomain.com 指向 scripts/index.php,我想我必须在您的否定匹配中包含 .php 文件条件#2。而且我需要将URI作为参数传递给脚本,所以我在规则中使用了(.*)。你同意这个策略还是我看错了?
    • 实际上,根据您的 cmets,我编辑了答案以添加 RewriteCond %{REQUEST_FILENAME} !-f 条件,因为它使其更健壮。可能还有其他标准文件,例如robots.txt, favicon.ico,很难一一列出。 RewriteCond %{REQUEST_FILENAME} !-f 从该重写中排除所有现有文件。
    • 还有两个问题!我见过%{REQUEST_FILENAME} !-f,但还没有很好地掌握REQUEST_FILENAME 的功能。它是否使文件扩展名匹配完全多余?我刚刚在我的网站上尝试了一个测试,%{REQUEST_FILENAME} !-f 似乎可以自己完成这项工作。二、(.*)^(.*)$在功能上有区别吗?从我目前看到的情况来看,后者更常见,但我不确定他们的表现是否有任何不同。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 2021-10-26
    • 2013-02-18
    • 1970-01-01
    相关资源
    最近更新 更多