Кто-нибудь знает, как заставить mod_rewrite включать расширения файлов в свое правило?

#php #apache #.htaccess #mod-rewrite #url-rewriting

#php #apache #.htaccess #mod-переписать #url-перезапись

Вопрос:

Мои правила перезаписи таковы:

 RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^([A-Za-z0-9_]*)/?$ index.php?a=$1 [NC]
RewriteRule ^([A-Za-z0-9_]*)/([A-Za-z0-9_]*)/?$ index.php?a=$1amp;b=$2 [NC]
RewriteRule ^([A-Za-z0-9_]*)/([A-Za-z0-9_]*)/([A-Za-z0-9_]*)/?$ index.php?a=$1amp;b=$2amp;c=$3 [NC]
  

URLhttp://example.com/home/test/b вернет внутренний эквивалент index.php?a=homeamp;b=testamp;c=b. Хотя это здорово (вчера я опубликовал здесь, пытаясь заставить mod_rewrite работать), я хотел бы создать URL, подобныйhttp://example.com/home/test/b.php для внутреннего вызова index.php?a=homeamp;b=testamp;c=b.php вместо того, чтобы Apache пытался найти (безуспешно) /var/www/home/test/b.php . Я хотел бы, чтобы мое правило перезаписи фактически обрабатывало все расширения файлов.

Ответ №1:

Вы можете использовать: этот код:

 RewriteEngine on
RewriteBase /

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

RewriteRule ^([w.] )/?$ index.php?a=$1 [L,QSA]
RewriteRule ^(w )/([w.] )/?$ index.php?a=$1amp;b=$2 [L,QSA]
RewriteRule ^(w )/(w )/([w.] )/?$ index.php?a=$1amp;b=$2amp;c=$3 [L,QSA]
  

[w.] в символьном классе позволит [a-zA-Z0-9._]

Ответ №2:

Если вы просто хотите обрабатывать расширения файлов, вы можете сделать это вручную, изменив последнюю строку на :

 RewriteRule ^([A-Za-z0-9_]*)/([A-Za-z0-9_]*)/([A-Za-z0-9_]*(.[a-z] )?)/?$ index.php?a=$1amp;b=$2amp;c=$3 [NC]
  

Добавив (.[a-z] )? , это обработало бы http://example.com/home/test/b.php , а затем дало бы вам, с var_dump($_GET); в index.php :

 array(3) { ["a"]=> string(4) "home" ["b"]=> string(4) "test" ["c"]=> string(5) "b.php" }
  

Надеюсь, это поможет.

Примечание: Он будет обрабатывать только одно . , имея по крайней мере одно [a-z] после него.

Если вы хотите обработать что-то вроде http://example.com/home/test/b.test.php , вам понадобится :

 RewriteRule ^([A-Za-z0-9_]*)/([A-Za-z0-9_]*)/([A-Za-z0-9_]*(.[a-z] )*)/?$ index.php?a=$1amp;b=$2amp;c=$3 [NC]