Url重写不适用于Apache

时间:2013-12-16 17:50:30

标签: php regex apache mod-rewrite url-rewriting

我想要以下内容:

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

Everthing按预期工作,但api的规则似乎不起作用。

更新1:

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

当我致电myhomepage.com/api/logout时,会将其重写为myhomepage.com/index.php?page=api&method=logout

更新2:

我的第一个想法是,也许有类似默认的rewrite_module。它将所有不是文件的内容重写为index.html或类似内容。特别是当我使用XAMPP时。

更新3:

经过一段时间的实验,我发现,我不能用api来调用它,因为它是一个目录。当我使用myhomepage.com/ap/logoutRewriteRule ^ap/(.*)$ api/$1.php重写时,它可以正常工作。任何想法如何使用目录名称?

更新4:

我将链接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>

我的api文件夹是htdocs/todo

的子目录

* 解决方案:*

这是我问题的最终解决方案:

ErrorDocument 404 /error.php

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]

特别感谢anubhava!

2 个答案:

答案 0 :(得分:2)

.htaccess中的前导斜杠不匹配,因为.htaccess是每个目录指令,而Apache从RewriteRule URI模式中剥离当前目录路径(从而导致斜杠)。

DOCUMENT_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 :(得分:1)

你的第一条规则,

RewriteRule ^/api/(.*)/(.*)$ api/$1.php?item=$2

假设将存在第三个路径元素,例如/api/logout/stuff。对于没有第三个元素的情况,您需要在其下添加另一个规则:

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