我有一个奇怪的问题,只发生在我的Mac上(我不尝试使用另一台mac,但确实尝试过在linux上运行)
这是我的.htaccess
RewriteEngine on
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)$ index.php?key=$1
在我的index.php上我把:
echo $_GET['url'];
如果我的网址是这样的话,它会返回一个空数组:
本地主机/测试/索引/ xpto
但如果我把它放在url中,则返回'index2 / xpto':
本地主机/测试/索引2 / xpto
问题在于字符串索引。
你们知道为什么它不能在我的Mac上运行但是在Linux上运行吗?
我在mac os x lion上使用标准的apache。 我只是在httpd.conf
上更改了这一行<Directory />
Options FollowSymLinks
AllowOverride All
Order deny,allow
Deny from all
</Directory>
....
<Directory "/Library/WebServer/Documents">
AllowOverride All
...
LoadModule rewrite_module libexec/apache2/mod_rewrite.so
被修改
通过工作我的意思是$ _GET ['key']不是空的。并显示我放入浏览器的网址。
但是当我在浏览器上使用此网址时:
http://127.0.0.1/test/index/xpto
我的$ _GET ['key']为空
如果我使用这个网址:
http://127.0.0.1/test/anythingbutindex/xpto
$ _GET ['key']有文字: anythingbutindex / xpto
我确实在我的mac上安装了XAMPP,这段代码可以正常使用索引。 所以问题在于MAC上的默认apache。
感谢。
答案 0 :(得分:1)
我不明白这是如何在Linux上运行的,或者是什么结果“正在工作”。对我来说,看起来它正在做着人们所期待的。但是我觉得你的RewriteRule
可能有点不对劲。它会做什么,它会将整个URI
传递给index.php
文件,而我认为您只想在index.php
之后使用参数?
如果您输入localhost/test/index/xpto
,并假设DocumentRoot
设置为/test
,则发送至index.php
的字符串将为index.php/exto
。同样的事情也适用于index2/exto
,因为RewriteRule并不关心您是否输入index
och index2
。
你可以试试这个:
RewriteEngine on
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^index/(.*)$ index.php?key=$1
如果您确实需要index
参数,可以将RewriteRule
更改为:
RewriteRule ^(index/)(.*)$ index.php?key=$1$2
希望它可以帮助你前进。
修改强>
澄清之后,我理解了这个问题。稍后进行了一些测试我发现解决方案非常明显,但我一开始并没有发现它。 RewriteRule
略有偏差,如果我使用它,几乎在我的系统上工作。
RewriteRule ^(.*)$ /index.php?key=$1 [L]
注意/
之前的index.php
。但是,这总是会重定向到index.php
,这意味着始终与RewriteCond
语句匹配。将语句更改为此可用于我的系统。
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
如果您设置了DirectoryIndex
!-d
,那么<path>/index.html
就是多余的,因为它总会尝试{{1}}或您配置的任何内容。
答案 1 :(得分:0)
我现在遇到了这个问题,最简单的方法是通过自制软件重新安装apache,因此它的工作方式与我在VPS上使用的Linux相同。 重新安装,重新配置端口大约花了两分钟,我使用了virutalhost.sh脚本指向〜/ Sites文件夹