多个参数友好的URL rewriteRule

时间:2014-10-10 07:30:21

标签: .htaccess mod-rewrite

我需要有关多个参数的rewriteRule的帮助,如下所示:

sitename.com/project.php?t=value1&a=value2

成为

sitename.com/project/value2/value1

但不知怎的,我无法解决问题,显示的页面为500 Internal Server Error

我的htaccess文件:

DirectoryIndex index.php
Options -Indexes

<Files *htaccess>
Deny from all
</Files>

<files page>
ForceType application/x-httpd-php
</files>

<IfModule mod_rewrite.c>
Options +SymLinksIfOwnerMatch
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f

#resolve .php file for extensionless php urls
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [L]

RewriteRule ^cp/edit-agent/([^/\.]+)/?$ cp/edit-agent.php?name=$1 [L]
RewriteRule ^([^/\.]+)/?$ agent.php?name=$1 [L]

#rule to handle example.com/123/sys
RewriteRule ^project/([0-9]+)/([^/\.]+)/?$ project.php?a=$1&t=$2 [L,QSA]
</IfModule>

请帮忙。

1 个答案:

答案 0 :(得分:1)

你的规则在大多数情况下看起来都不错,但你有两个问题。第一个也是最明显的问题是你有2个条件只适用于第一个规则:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f

仅适用于此规则:

#resolve .php file for extensionless php urls
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [L]

当它还需要应用于此规则时:

RewriteRule ^([^/\.]+)/?$ agent.php?name=$1 [L]

条件仅适用于紧随其后的规则,因此您需要复制它们。

另一个问题不是那么明显,但这可能是造成500错误的原因,是这个条件:

RewriteCond %{REQUEST_FILENAME}\.php -f

问题在于您有/project/123/abcd之类的请求,并且您拥有文件/project.php%{REQUEST_FILENAME}变量还考虑了PATH INFO,因此如果你只是将.php粘贴到最后,它会实际检查:/project.php/123/abcd并通过-f检查。在规则本身中,你将它追加到最后,因此:project/123/abcd.php。然后下一次,相同的条件再次传递,然后.php再次附加到末尾:project/123/abcd.php.php,因此无限循环。

因此,您需要将规则更改为:

DirectoryIndex index.php
Options -Indexes -Mutiviews

<Files *htaccess>
Deny from all
</Files>

<files page>
ForceType application/x-httpd-php
</files>

<IfModule mod_rewrite.c>
Options +SymLinksIfOwnerMatch
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f

#resolve .php file for extensionless php urls
RewriteCond %{DOCUMENT_ROOT}/$1\.php -f
RewriteRule ^(.*)$ $1.php [L]

RewriteRule ^cp/edit-agent/([^/\.]+)/?$ cp/edit-agent.php?name=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/\.]+)/?$ agent.php?name=$1 [L]

#rule to handle example.com/123/sys
RewriteRule ^project/([0-9]+)/([^/\.]+)/?$ project.php?a=$1&t=$2 [L,QSA]
</IfModule>