mod_rewrite问题与参数

时间:2015-02-25 17:04:51

标签: php apache .htaccess mod-rewrite

我有以下.htaccess文件:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
RewriteRule ^portfolio-single/([^/.]+)/?$ portfolio-single.php?id=$1 [L]

<Files ~ "^\.(htaccess|htpasswd)$">
deny from all 
order deny,allow
</Files>

Options -Indexes

ErrorDocument 400 /error.php
ErrorDocument 403 /error.php
ErrorDocument 404 /error.php
ErrorDocument 405 /error.php
ErrorDocument 408 /error.php
ErrorDocument 500 /error.php
ErrorDocument 502 /error.php
ErrorDocument 504 /error.php

目前以php扩展程序结尾的所有页面都运行良好。例如,www.somewebsite.com/blog.php现在可通过/blog访问。但是我想要某个页面,即portfolio-single.php?id=123可以通过/portfolio-single/123访问。第4行,你可以看到我从这个website获取的代码,我一直试图让它工作,但是当我通过/portfolio-single/123访问组合单时,我会继续获得404。我错过了什么?后续问题是我是否必须重新启动XAMPP才能使.htaccess文件的更改生效(到目前为止它已经无效)。

2 个答案:

答案 0 :(得分:1)

尝试交换这两条规则。最后一条规则更具体,因此它应首先匹配。


虽然您当前的方法有效,但使用一个catch-all规则和执行路由的通用句柄脚本更为常见。

RewriteRule ^(.*)$ handler.php?path=$1 [L]

然后handler.php可以决定如何处理blogportfolio-single/x以及non-existing-page

路由器现在可以用PHP实现,它可以为您提供更多自由,例如基于超过正则表达式动态添加路由和匹配。

此方法的另一个优点是您的应用程序现在只有一个入口点。这使得自举更加容易,因为只有一条路径。

答案 1 :(得分:0)

要添加.php扩展名,您必须检查相应的.php文件是否存在firts:

RewriteEngine On

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}\.php -f [NC]
RewriteRule ^(.+?)/?$ $1.php [NC,L]

RewriteRule ^portfolio-single/([^/.]+)/?$ portfolio-single.php?id=$1 [L,NC,QSA]