.htaccess mod_rewrite子目录到URL参数

时间:2011-12-17 16:40:28

标签: apache .htaccess mod-rewrite

我希望以前不会一遍又一遍地问这个问题,但是我没有使用google,w3schools等进一步得到答案。所以这是我的问题: 我正在编写一个脚本,该脚本创建了我在主页上的项目索引,并根据信息文件创建了包含图像和预告文本的精美列表。我主要在github上有我的项目,自述文件是markdown所以我认为我可以使用PHP从github按需的最新blob的markdown动态生成HTML,因此它会自动更新。 我的目录结构如下所示:

projects
    project1
        .remoteindex
        .info
    project2
        .remoteindex
        .info
    index.php
    .htaccess

因此,当只请求domain.tld/projects/时,我从.info获取信息并为所有项目制作一个很好的索引。但如果domain.tld/projects/project1/请求它,我想在内部将其重定向到domain.tld/projects/?dir=project1以进行我的降价解析,依此类推。但domain.tld/projects/project1/image.png不应重定向。

这就是我的尝试:

.htaccess
RewriteEngine on
RewriteRule ^([^/]+)/?$ index.php?dir=$1 [R,L]

我将其重定向而不是重写,以便我可以看到错误是什么,因为我刚得到404.我被重定向到的网址是domain.tld/home/www/web310/html/projects/index.php?dir=project1所以很明显内部结构出了问题Web服务器的路径是什么。 我希望你能理解我的问题,如果有人可以帮助我,我会很高兴,因为我在.htaccess完全迷失了。

编辑:

请参阅下面的回答,了解所使用的.htaccess

奇怪的是,如果我的子目录中有index.html,我的本地Web服务器(带有XAMPP for Mac OS X 1.7.3的Apache)不会重写,而index.html会被重写显示,没有一个它正常工作。但在我的主页服务我真实的网络服务器上,它重写有和没有index.html(这是我想要的)。有关于此的任何提示吗?

3 个答案:

答案 0 :(得分:3)

感谢迄今为止的所有帮助!你们真棒!

我发现两种解决方案的共生对我来说很有效:

RewriteEngine on
RewriteBase /projects
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} -d
RewriteRule ^([^/]+)/?$ index.php?dir=$1 [QSA,L]

当然只有没有[R],这是我的错。 (请参阅我的问题编辑以获取另一个问题)。

答案 1 :(得分:0)

您需要向htaccess添加RewriteBase /projects。 这样重定向将正常工作。

修改

RewriteEngine on
RewriteRule ^index.php - [L]
RewriteRule ^([^/]+)/?$ index.php?dir=$1 [R,L]

答案 2 :(得分:0)

根据您的要求,执行重定向非常重要 ,但让重写内部网址,即RewriteRule [R,L]结束,而是以[L]结束,也许是“query string append”指令,以保留?之后的内容,因此这应该是[QSA,L]

现在我要做的就是避免重写静态文件:如果它不是文件,那么(并且只有那时)测试它:

# if it's not a file...
RewriteCond %{SCRIPT_FILENAME} !-f
# ... and it's a dir
RewriteCond %{SCRIPT_FILENAME} -d
# ... then rewrite it internally and stop further processing:
RewriteRule projects/([^/]+)(/?)$ index.php?dir=$1 [QSA,L]

现在有两个提示:

请尝试使用RewriteLog指令:它可以帮助您跟踪此类问题:

# Trace:
# (!) file gets big quickly, remove in prod environments:
RewriteLog "/web/logs/mywebsite.rewrite.log"
RewriteLogLevel 9
RewriteEngine On

我最喜欢检查regexp的工具:

http://www.quanetic.com/Regex(别忘了选择ereg(POSIX)而不是preg(PCRE)!)