嘿所以我试图使用Apache的mod_rewrite模块做一些基本的url在我的网站上的重新调整,所以他们变得更友善一点
基本上我有一个虚拟主机文件,看起来像这样
<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。
任何人都可以帮我在我做错了什么或build议一些方法来解决问题,在此先感谢。 布兰登
您希望/PlayVideo/13424/可以工作,但重写规则的第一部分是/video/ 。
您也不要使用第二部分第一部分中匹配的号码,这意味着无论url中的号码如何,每个人都会一直观看相同的video。
将其更改为解决这两个问题:
RewriteRule /PlayVideo/([0-9]+) /PlayVideo/index.php?videoID=$1
我之前应该注意到这一点,但还有其他两个问题。 首先是你的重写规则在一个<Directory>块中,这改变了它们的工作方式。 解释这个简单的方法是删除主导斜线。
技术上更准确的描述是传递到重写规则的path被匹配是一个文件系统path而不是一个URI,它的目录已经从它的开头删除。
所以在一个<Directory>块中,你应该使用:
RewriteRule PlayVideo/([0-9]+) PlayVideo/index.php?videoID=$1
另一件事情是轻微的,但我更喜欢没有一个<IfModule>块。 这对于包维护者来说非常方便,他们的configuration将被所有能力级别的人部署在成千上万台不同的机器上,但是对于一个部署(可能)只有一个pipe理员,他们所做的只是隐藏其他的错误。 如果你忘了加载重写模块(注释掉,删除符号链接,不pipe怎么说),Apache仍然可以正常启动,并且不会抛出任何错误,但重写模块将不起作用,依赖它的URI将导致404 ,就像你看到的一样。 如果没有<IfModule>块,那么相同的错误将导致Apache无法启动,并会导致一个有用的错误消息。
虽然可以这样匹配,但是我的大脑不能很好地处理正则expression式,所以我倾向于把事情分解得更多。 虽然在apache方面比较慢,但我更喜欢更多的东西:
RewriteBase /PlayVideo
RewriteCond %{REQUEST_URI} ^/([0-9]+)$
RewriteRule ^(.*) index.php?video=$1 [L,QSA]
QSA不是必需的,但您可能希望将来传递更多的查询string。 这给了你这个能力。
另外,如果您有权访问日志,请设置以下内容(仅限debugging!):RewriteLogLevel 4
然后逐步浏览日志,看看重写规则在什么地方做了一些不同于你的预期的事情。