没有 .htaccess 的 Mod 重写

Posted

技术标签:

【中文标题】没有 .htaccess 的 Mod 重写【英文标题】:Mod rewrite without .htaccess 【发布时间】:2015-07-23 10:59:12 【问题描述】:

假设我有一个名为

的网站
foo.com

我可以访问foo.com,它运行在根文件夹中的index.php。我的问题是:如何在不启用 htaccess 的情况下编辑 vhost 文件以启用 rewrite mod?

我的目标是能够写作

http://foo.com/bar/loremipsum/dolor

进入我的浏览器地址栏并运行 index.php,无论 url 中有多少 / 字符。我的 index.php 将处理由 /

分隔的参数

我怎样才能做到这一点?

编辑: 虚拟主机文件:

<VirtualHost *:80>
        ServerName myproject.com
        ServerAlias www.myproject.com

        ServerAdmin webmaster@localhost
        DocumentRoot /opt/apps/myproject

        <Directory /opt/apps/myproject>
            # disable htaccess
            AllowOverride None

            # route everything to index.php
            RewriteCond %REQUEST_FILENAME !-f
            RewriteCond %REQUEST_FILENAME !-d
            RewriteRule ^ /index.php [L]

            Require all granted
        </Directory>
        ErrorLog $APACHE_LOG_DIR/error.log
        CustomLog $APACHE_LOG_DIR/access.log combined
</VirtualHost>

编辑:问题,正如公认的答案所暗示的那样,该主机不包含打开重写引擎的行。这条线出现在答案中。这解决了问题。

【问题讨论】:

我愿意接受批评。我很乐意阅读为什么我的问题不好/没有帮助 在 vhost 文件中没有您要编辑的内容 need。如果启用了 mod_rewrite 模块,那么您只需在 Directory 指令中的特定 vhost 中添加您的规则。如果未启用该模块,则按上述添加规则。 我明白了。所以,如果它被启用,像这样的 RewriteRule ^(.*)$ index.php [QSA,L] 应该在目录标签中工作? 没错,没有什么特别需要做的。 而且 Apache 必须重新启动,对吧? 【参考方案1】:

要禁止使用 htaccess,您需要在文档根目录的 &lt;Directory&gt; 容器中使用此指令,然后您可以将 mod_rewrite 规则放在同一个容器中:

<Directory "/var/www/htdocs/">
    # disable htaccess
    AllowOverride None

    # route everything to index.php
    RewriteEngine On
    RewriteCond %REQUEST_FILENAME !-f
    RewriteCond %REQUEST_FILENAME !-d
    RewriteRule ^ /index.php [L]
</Directory>

假设“/var/www/htdocs”是您的文档根目录。

为确保加载了 mod_rewrite,请检查 httpd.conf 文件中是否有包含 mod_rewrite 的 LoadModule 行,并确保它未注释。每当您更改虚拟主机配置时,您都需要重新启动服务器。

简短说明:

线条:

RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d

是检查请求是否不是现有文件 (-f) 或现有目录 (-d) 的条件。这些条件有两个主要目的:

    它防止重写引擎循环,因此index.php 也不会被重写。由于index.php 是现有文件,因此条件会停止重写引擎。 它允许重写图像或脚本等资源和资产。

如果您希望所有内容无论如何都路由到index.php(包括图像或其他任何内容),那么您可以将这两个条件更改为:

RewriteCond %REQUEST_URI !^/index.php

以便除index.php 之外的所有内容都被重写。

【讨论】:

我正在搜索 httpd.conf。我希望我能轻松找到它 无效命令 RewriteCond。我想我必须设置 LoadModule。 我运行了a2enmod rewrite,重启了服务器,但是foo.com/bar没有运行index.php @LajosArpad /bar 是否作为目录存在? 不,它不存在于根目录中。它存在于其他地方。但即使 bar 目录不存在,我也想运行 index.php。例如 foo.com/bar/lorem/ipsum 应该运行 index.php,它将解析参数,例如 param0 = bar,param1 = lorem param2 = ipsum。基本上,我想不管 url 运行 index.php。

以上是关于没有 .htaccess 的 Mod 重写的主要内容,如果未能解决你的问题,请参考以下文章

没有 .htaccess 的 Mod 重写

有没有办法在不使用mod_rewrite和.htaccess的情况下重写我的网址?

htaccess 条件重写规则与 mod_GeoIP

PHP 内置服务器和 .htaccess mod 重写

如果我使用.htaccess mod重写规则,PHP Cookie不可用

htaccess mod 用斜杠将 $_GET 重写为变量