htaccess - mod_rewrite 将虚拟目录或文件作为参数传回 index.php?

Posted

技术标签:

【中文标题】htaccess - mod_rewrite 将虚拟目录或文件作为参数传回 index.php?【英文标题】:htaccess - mod_rewrite pass virtual directory or file back to index.php as parameter? 【发布时间】:2015-03-18 05:38:16 【问题描述】:

我正在尝试获取要传递回 index.php 的虚拟目录或文件

例如,我希望 / 之后的所有内容都传递回索引,然后将针对数据库进行检查,但是“virtual_directory”和“virtual_file.jpg”实际上并不存在,它们只是参数。

somedomain.com/virtual_directory
somedomain.com/virtual_file.jpg

现在,问题是 一切 都过去了。因此,假设我只想转到主目录(或只是 index.php),我将输入 url (somedomain.com),它会将尾部斜杠作为参数传递。如果我尝试访问 somedomain.com/index.php 也是一样。它将与 /index.php 一起传递(即:我无法访问 else 语句)。

有没有办法让它在我直接进入索引时不会通过?

这两个将作为参数传递,我也不想要它们。

somedomain.com/
somedomain.com/index.php

.htaccess:

Options +FollowSymLinks
RewriteEngine on
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule .* /index.php [L]

index.php 将读取 '/' 之后的内容并对其进行处理。

if ($_SERVER['REQUEST_URI']) 
    echo nl2br("Parameter Passed!\n");
    echo 'Parameter That Passed:' .$_SERVER['REQUEST_URI'];
 else
    echo 'No Parameter Passed';
    echo 'You Are Visiting domain.com/ or domain.com/index.php';

【问题讨论】:

那么问题出在哪里? 添加了一个问题。我不知何故忘记添加它。 【参考方案1】:

你的 php 代码的“else”部分没有被访问的原因是因为总会有一个$_SERVER['REQUEST_URI'] 值。这是一个始终是请求的服务器变量。因此,您永远不会遇到“未传递参数”。如果将参数作为 GET 变量或路径信息传递,您可能想要什么:

Options +FollowSymLinks
RewriteEngine on
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^(.*)$ /index.php?request=$1 [L]

你的代码是:

if ($_GET['request']) 
    echo nl2br("Parameter Passed!\n");
    echo 'Parameter That Passed:' .$_GET['request'];
 else
    echo 'No Parameter Passed';
    echo 'You Are Visiting domain.com/ or domain.com/index.php';

或路径信息:

Options +FollowSymLinks
RewriteEngine on
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^(.*)$ /index.php/$1 [L]

你的代码是:

if ($_SERVER['PATH_INFO']) 
    echo nl2br("Parameter Passed!\n");
    echo 'Parameter That Passed:' .$_SERVER['PATH_INFO'];
 else
    echo 'No Parameter Passed';
    echo 'You Are Visiting domain.com/ or domain.com/index.php';

【讨论】:

12shadow12的用词很有趣...我只是来写“美丽的答案”。干得好,Jon Lin,非常感谢!【参考方案2】:

你可以试试这个

 <IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    RewriteRule ^(.*)/$ /$1 [L,R=301]

    RewriteCond %REQUEST_FILENAME !-d
    RewriteCond %REQUEST_FILENAME !-f
    RewriteRule ^ index.php [L]
</IfModule>

【讨论】:

以上是关于htaccess - mod_rewrite 将虚拟目录或文件作为参数传回 index.php?的主要内容,如果未能解决你的问题,请参考以下文章

将 .htaccess 转换为 nginx (mod_rewrite)

没有 mod_rewrite 的漂亮 URL,没有 .htaccess

使用 .htaccess 和 mod_rewrite 强制 SSL/https

.htaccess 新手问题使用 mod_rewrite

htaccess 2 mod_rewrite

使用 PHP 和 .htaccess (mod_rewrite) 管理 slug