在虚拟主机上开始使用 apache mod_rewrite

在虚拟主机上开始使用 apache mod_rewrite

嘿,所以我正在尝试使用 apache 的 mod_rewrite 模块对我的网站上的 URL 进行一些基本的重写,以便它们变得更加 SEO 友好

基本上我有一个像这样的虚拟主机文件

    <VirtualHost *:80>
        ServerAdmin [email protected]
        ServerName mind-knowledge.com
        ServerAlias www.mind-knowledge.com

        DocumentRoot /var/www/tagmenu
        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>
        <Directory /var/www/tagmenu>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
                <IfModule mod_rewrite.c>
                        RewriteEngine on
                        RewriteRule /video/([0-9]+) /PlayVideo/index.php?videoID=13424
                </IfModule>
        </Directory>
</VirtualHost>

现在据我所知,重写规则应该允许 http://www.mind-knowledge.com/PlayVideo/13424/ 呈现为页面,http://www.mind-knowledge.com/PlayVideo/index.php?videoID=13424这是正确的吗?

目前我得到 404 ,并且我已经运行sudo a2enmod rewrite并重新加载了 apache。

有人能帮助我解决我做错的事情或建议一些解决问题的方法吗?提前谢谢了。布伦丹

答案1

您想/PlayVideo/13424/工作,但重写规则的第一部分是/video/

您也不会在第二部分中使用第一部分中匹配的数字,这意味着无论他们的 URL 中的数字是什么,每个人都会始终观看相同的视频。

将其更改为此即可解决这两个问题:

RewriteRule /PlayVideo/([0-9]+) /PlayVideo/index.php?videoID=$1

我之前就应该注意到这一点,但可能还有另外两个问题。首先,您的重写规则位于一个<Directory>块内,这会改变它们的工作方式。解释这一点的简单方法是删除前导斜杠。

从技术上来说,更准确的描述是,传递给要匹配的重写规则的路径是文件系统路径而不是 URI,并且从开头删除了目录。

因此,在一个<Directory>块内,您应该使用:

RewriteRule PlayVideo/([0-9]+) PlayVideo/index.php?videoID=$1

另一件事虽然不重要,但我宁愿<IfModule>根本不使用块。这些对于软件包维护者来说很方便,他们的配置将由各种能力水平的人部署在数千台不同的机器上,但对于(可能)只有一个管理员的单个部署,它们所做的只是隐藏其他错误。如果您忘记加载重写模块(注释掉该行、删除符号链接等),Apache 仍将正常启动并且不会抛出任何错误,但 rerwrite 模块将无法工作,并且依赖它的 URI 将导致 404,就像您看到的那样。如果没有阻止<IfModule>,同样的错误会导致 Apache 无法启动并导致有用的错误消息。

答案2

虽然可以这样匹配,但我的大脑不太擅长处理正则表达式,所以我倾向于将事情进一步拆分。虽然在 Apache 方面速度较慢,但​​我更喜欢以下方式:

RewriteBase /PlayVideo
RewriteCond %{REQUEST_URI} ^/([0-9]+)$
RewriteRule ^(.*) index.php?video=$1 [L,QSA]

QSA 不是必需的,但您可能希望将来传递更多查询字符串。这为您提供了这种能力。
此外,如果您有权访问日志,请设置以下内容(仅在调试时!):RewriteLogLevel 4

然后逐步检查日志,查看重写规则在什么时候做了与您预期不同的事。

相关内容