.htaccess重写不在子目录中工作

时间:2013-03-02 00:28:42

标签: apache .htaccess mod-rewrite

我的网络路径是: http://git.example.com/(例如)

我的文档根目录是:

/home/user/git/

在doc根目录中,我有两个文件夹:

/home/user/git/john
/home/user/git/doe

这些文件夹分别代表john和doe的git repos。它们托管在Web服务器上,以便在提交给主服务器之前可以对代码进行测试。

我遇到的问题是repo中的站点代码有一个wordpress样式的.htaccess文件,这样脚本就可以处理数据库中为每个产品等指定的所有页面slug。我有以下代码:我的.htaccess文件位于/home/user/git/john目录中:

RewriteEngine On
RewriteBase /john/

# FORCE BROWSER TO URL AND DO NOT ATTEMPT TO SLUG MATCH THESE
RewriteCond %{REQUEST_URI} ^/john/checkout/(.*)$ [OR]
RewriteCond %{REQUEST_URI} ^/john/admin/(.*)$ [OR]
RewriteRule ^.*$ - [L]

# ROUTE THROUGH CMS
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php

我也尝试将重写基础更改为/,我尝试将最后一行更改为RewriteRule . /john/index.php及其中的所有变体。我什么都做不了。

无意义是什么意思?好吧我说我有网址http://git.example.com/john/some_product_name.html - 我发现404找不到错误,而apache错误日志只有一个标准的404没有这样的请求文件。而已。它就像“没有糟糕的文件不在那里......当你找不到文件时,你会想重写它!”

无论如何,当所有内容都在根目录下运行时,这个确切的脚本可以完美地运行,因为它位于实际站点上,但是将副本移动到子目录一直是个问题。我可以为项目中的每个开发人员创建一个新的子域,并从他们的doc_root运行git,但实际上......应该有一种方法可以使这个工作。我错过了什么?

另外 - 我可以确认重写没有发生,因为在index.php文件的顶部,我有:echo "I'm here"; exit;所以不应该找到404,我应该看到一个空白白页,上面写着“我在这里”的信息。我没有。

**更新**

我通过顶部的线条注释掉了这样的力量,现在正在工作:

RewriteEngine On
RewriteBase /john/

# FORCE BROWSER TO URL AND DO NOT ATTEMPT TO SLUG MATCH THESE
#RewriteCond %{REQUEST_URI} ^/john/checkout/(.*)$ [OR]
#RewriteCond %{REQUEST_URI} ^/john/admin/(.*)$ [OR]
#RewriteRule ^.*$ - [L]

# ROUTE THROUGH CMS
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php

为什么世界上这些线会导致这个问题?我访问的网址肯定与这些模式都不匹配!

1 个答案:

答案 0 :(得分:2)

删除第一条规则中的最后一个[OR],如下所示:

# FORCE BROWSER TO URL AND DO NOT ATTEMPT TO SLUG MATCH THESE
RewriteCond %{REQUEST_URI} ^/john/checkout/(.*)$ [OR]
# Don't use OR in next line.
RewriteCond %{REQUEST_URI} ^/john/admin/(.*)$ 
RewriteRule ^.*$ - [L]