【问题标题】:Url Rewriting doesn't work with Apache网址重写不适用于 Apache
【发布时间】:2014-01-04 05:24:52
【问题描述】:

我想要以下:

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:

我的第一个想法是,也许有类似默认 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!

【问题讨论】:

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


    【解决方案1】:

    .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]
    

    【讨论】:

    • 我在发布之前已经对其进行了适当的测试。 Q1。你把它放在 DOCUMENT_ROOT 中了吗? Q2。你在这个 .htaccess 中还有其他规则吗? Q3。 /api 文件夹中是否也有 .htaccess?
    • A1.我有一个从 todo.js 到 localhost/todo/ 的内部重定向,我已经把它放在那里了。 A2。没有。 A3 没有
    • 希望api是todo目录下的子目录。我相应地编辑了我的代码。现在可以试试吗?
    • 好的。刚刚尝试了一些东西。这终于对我有用RewriteCond %{REQUEST_FILENAME} !-f RewriteRule api/([^/]+)/?$ api/$1.php [L]
    • 但请更新您的帖子。确保在 api 之前删除 ^
    【解决方案2】:

    你的第一条规则,

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

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

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

    【讨论】:

    • 是的,我忘了,我想添加另一个元素。但我试过这样宽度只有一个元素,它也不起作用。
    猜你喜欢
    • 2013-10-07
    • 2015-10-25
    • 2011-03-22
    • 2013-08-20
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多