2014-10-10 2 views
1

мне нужна помощь на RewriteRule для нескольких параметров следующим образом:несколько параметров дружественных URL 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

Вы по-прежнему выглядите нормально, но у вас есть 2 проблемы. Первая и самая очевидная проблема заключается в том, что у вас есть 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 и PASS -f. BUt в самом правиле, вы добавляете его до конца, таким образом: 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> 
Смежные вопросы