没有 .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,您需要在文档根目录的 <Directory>
容器中使用此指令,然后您可以将 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 重写的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在不使用mod_rewrite和.htaccess的情况下重写我的网址?