mod_rewrite参数问题


mod_rewrite issue with parameters

我有以下.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 行您可以看到我从这个网站上获取的代码,我一直在尝试让它工作,但是当我通过 /portfolio-single/123 访问投资组合单曲时,不断得到 404。我错过了什么?一个后续问题是我是否必须重新启动 XAMPP 才能使对 .htaccess 文件的更改生效(到目前为止,它还没有工作(。

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


虽然当前的方法有效,但更常见的做法是使用一个捕获规则和一个执行路由的通用句柄脚本。

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

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

路由器现在可以在PHP中实现,这为您提供了更多的自由,例如基于正则表达式动态添加路由和匹配项。

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

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

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]