【问题标题】:Apache ReWrite rule stopping portions of our appApache ReWrite 规则停止我们应用程序的某些部分
【发布时间】:2010-12-06 08:49:35
【问题描述】:

我们的应用程序在我们的 PHP 应用程序中使用了重写规则,我们的开发人员将这些重写规则添加到了我们的 Apache VHosts 文件中:

我已根据以下建议更新了我们的重写规则。

目前我的 VHosts 文件配置如下所示:

RewriteCond %blog !-d 重写规则 ^/([a-zA-Z0-9-,]+)/?$ /index.php?a=$1

RewriteCond %blog !-d 重写规则 ^/([a-zA-Z0-9-,]+)/([a-zA-Z0-9-,]+)/?$ /index.php?a=$1&b=$2

RewriteCond %blog !-d 重写规则 ^/([a-zA-Z0-9-,]+)/([a-zA-Z0-9-,]+)/([a-zA-Z0-9-,]+)/?$ /index.php?a=$1&b=$2&c=$3

RewriteCond %blog !-d 重写规则 ^/([a-zA-Z0-9-,]+)/([a-zA-Z0-9-,]+)/([a-zA-Z0-9-,]+)/([ a-zA-Z0-9-,]+)/?$ /index.php?a=$1&b=$2&c=$3&d=$4&e=$5

我目前能够成功访问我们所有的其他应用程序选项卡,例如 /goods 等。但我仍然无法访问 www.test.com/blog

它仍然将我重定向到我们应用程序的主 index.php 页面。从重写日志:

[13/Oct/2009:17:08:41 --0400] [www.test.com/sid#8d03d8][rid#b902d8/initial] (1) 通过/blog/wp-login.php [13/Oct/2009:17:08:41 --0400] [www.test.com/sid#8d03d8][rid#b942f8/initial] (1) 继续 //public_html/index.php [OK ]

谢谢

【问题讨论】:

    标签: php apache mod-rewrite


    【解决方案1】:

    尝试使用条件

    RewriteCond %{REQUEST_URI} !^/blog$ [OR]
    RewriteCond %{REQUEST_URI} !^/blog/
    RewriteRule ^/([a-zA-Z0-9-_,]+)/?$ /index.php?a=$1
    

    这是一个使用条件和正则表达式的问题。这应该防止在 URI 以“/blog/”开头时触发重写

    【讨论】:

    • 感谢您的意见米哈尔。我已经修改了重写规则以匹配您上面的示例。但现在我看到了奇怪的行为。我可以访问我的网站 www.dudeimgettingmarried.com 并单击气泡图标以访问 www.dudeimgettingmarried.com/blog,它会完美加载。但是,如果我直接在浏览器中输入该 url,它会被重定向到一个失败的页面。任何想法为什么?我还可以通过书签访问我的 Wordpress 管理页面,但是当我尝试使用真正的 URL 时,它再次失败并出现重定向问题:dudeimgettingmarried.com/blog/wp-admin/wp-login。有任何想法吗?谢谢
    • 是的,我已经更改了帖子。问题出在斜杠上。现在,即使您输入 example.com/blog 和 example.com/blog/,它也应该可以工作
    【解决方案2】:

    您在重写规则中尝试了很多东西。我建议你不要这样做。

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^/(.*)$ /index.php?url=$0 [PT,L]
    

    我建议您将完整的字符串重写为$_GET['url'] 变量。你可以在你的代码中分解这个变量。这样您只需编辑一次虚拟主机。

    RewriteCond 仍然是双向的(在上面和下面的示例中)。

    这些重写条件将检查文件或目录是否存在。如果不是,它将应用重写规则

    如果条件不起作用,请尝试将条件置于每个 RewriteRule 之上 像这样:

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^/([a-zA-Z0-9-,]+)/?$ /index.php?a=$1 
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^/([a-zA-Z0-9-,]+)/([a-zA-Z0-9-,]+)/?$ /index.php?a=$1&b=$2 
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^/([a-zA-Z0-9-,]+)/([a-zA-Z0-9-,]+)/([a-zA-Z0-9-,]+)/?$ /index.php?a=$1&b=$2&c=$3 
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^/([a-zA-Z0-9-,]+)/([a-zA-Z0-9-,]+)/([a-zA-Z0-9-,]+)/([a-zA-Z0-9-,]+)/?$ /index.php?a=$1&b=$2&c=$3&d=$4
    

    【讨论】:

    • 感谢罗伯特的反馈。在尝试了您的建议后,我意识到我最初的问题描述并不准确。如果您有时间,请查看我更新的描述。再次感谢!
    • 我的解决方案还有效吗,史蒂夫?
    • 罗伯特,我尝试使用上面每个规则指定的 ReWriteCond 更新命令,但我仍然得到相同的行为。请参阅我更新的描述。再次感谢您抽出时间提供帮助。
    • Steve, RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d 不能更改。不要将 {REQUEST_FILENAME} 更改为博客。让这些重写条件不变
    • 谢谢罗伯特。我进行了您建议的更改,并且能够访问我的 /blog/index.php 和 /blog/wp-login.php。但我无法访问博客下的任何目录。例如 blog/wp-admin/ 失败,这是 wordpress 在第一次登录后带我去的地方。这些更改的另一个问题是我们的应用程序选项卡在我们的 DocRoot 下没有每个选项卡主题的目录。因此,某些应用程序选项卡不再适用于这一新变化。感谢您的反馈。
    猜你喜欢
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多