我希望以前不会一遍又一遍地问这个问题,但是我没有使用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
(这是我想要的)。有关于此的任何提示吗?
答案 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)!)