Php Url重写不会';我不能和Apache一起工作

Php Url重写不会';我不能和Apache一起工作,php,regex,apache,mod-rewrite,url-rewriting,Php,Regex,Apache,Mod Rewrite,Url Rewriting,我希望: <VirtualHost todo.js:80> ServerAdmin slajaa09@htlkaindorf.at DocumentRoot "C:/xampp/htdocs/todo" ServerName todo.js ServerAlias todo.js </VirtualHost> myhomepage.commyhomepage.com/index.php myhomepage.com/mypagemyhom

我希望:

<VirtualHost todo.js:80>
    ServerAdmin slajaa09@htlkaindorf.at
    DocumentRoot "C:/xampp/htdocs/todo"
    ServerName todo.js
    ServerAlias todo.js
</VirtualHost>
myhomepage.com
myhomepage.com/index.php

myhomepage.com/mypage
myhomepage.com/index.php?page=mypage

myhomepage.com/mypage/mymethod
myhomepage.com/index.php?page=mypage&method=mymethod

myhomepage.com/api/logout
myhomepage/api/logout.php

这是我的.htaccess文件:

RewriteEngine On

RewriteBase /

RewriteRule ^/api/(.*)$ api/$1.php

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/(.*)/(.*)$ index.php?page=$1&method=$2&item=$3

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/(.*)$ index.php?page=$1&method=$2

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?page=$1
每件事都能正常工作,但是
api
的规则似乎不起作用

更新1:

RewriteRule ^/api/(.*)$ api/$1.php
当我调用
myhomepage.com/api/logout
时,它会将其重写为
myhomepage.com/index.php?page=api&method=logout

更新2:

RewriteRule ^/api/(.*)$ api/$1.php
我的第一个想法是,可能有一个类似于默认重写模块的东西。它将所有非文件的内容重写为index.html或类似的内容。尤其是当我使用XAMPP时

更新3:

RewriteRule ^/api/(.*)$ api/$1.php
经过一点实验,我发现我不能用
api
调用它,因为它是一个目录。例如,当我用
myhomepage.com/ap/logout
RewriteRule^ap/(.*)$api/$1.php
重写它时,效果很好。你知道如何使用目录名来完成这项工作吗

更新4:

RewriteRule ^/api/(.*)$ api/$1.php
我将链接todo.js(从Windows/System32/drivers/etc中的主机)重定向到127.0.0.1 然后,我编辑了httpd vhosts.conf并添加了以下内容:

<VirtualHost todo.js:80>
    ServerAdmin slajaa09@htlkaindorf.at
    DocumentRoot "C:/xampp/htdocs/todo"
    ServerName todo.js
    ServerAlias todo.js
</VirtualHost>
特别感谢阿努巴瓦

你的第一条规则

RewriteRule ^/api/(.*)/(.*)$ api/$1.php?item=$2
假设将有第三个路径元素,例如
/api/logout/stuff
。对于没有第三个元素的情况,需要在其下方添加另一条规则:

RewriteRule ^/api/(.*) api/$1.php

前导斜杠在
.htaccess
中不匹配,因为
.htaccess
是每个目录指令,Apache从
重写规则
URI模式中删除当前目录路径(因此前导斜杠)

文档\u ROOT/.htaccess
文件中使用以下规则:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule api/([^/]+)/?$ api/$1.php [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)/(.*)$ index.php?page=$1&method=$2&item=$3 [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/(.*)$ index.php?page=$1&method=$2 [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/?$ index.php?page=$1 [L,QSA]

是的,我忘了,我想添加另一个元素。但我用这种方法尝试了一个元素,它也不起作用。我在发布之前已经测试过了。问题1。你把它放在文档根目录下了吗?问题2。你在这方面还有其他规则吗?第三季度。您在
/api
文件夹中也有.htaccess吗?A1。我有一个从todo.js到localhost/todo/的内部重定向,我把它放在了那里。A2。不。A3 NopeI hope api是todo目录中的子目录。我相应地编辑了代码。你现在能试试吗?好的。我试了点东西。这终于对我有效了
RewriteCond%{REQUEST\u FILENAME}-重写规则api/([^/]+)/?$api/$1.php[L]
,但请更新您的帖子。确保在api之前删除^