嘿,所以我正在尝试使用 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
然后逐步检查日志,查看重写规则在什么时候做了与您预期不同的事。