2010-07-05 3 views
0

Я хотел бы переписать /anything.anyextension в /?post=anything.htaccess rewrite

например:

  • /this-is-a-post.php в /?post=this-is-a-post или
  • /this-is-a-post.html в /?post=this-is-a-post или даже
  • /this-is-a-post/ в /?post=this-is-a-post

Я попытался

RewriteRule ^([a-zA-Z0-9_-]+)(|/|\.[a-z]{3,4})$ ?$1 [L] 

но не работает.

Любая помощь приветствуется.

ответ

0

Если у вас есть доступ к основной конфигурации сервера, используйте:

RewriteRule ^/(.+)\.\w+$ /?post=\1 [L] 

Если нет, и вы вынуждены поместить это в .htaccess файл, вы можете попробовать

RewriteRule ^(.+)\.\w+$ /?post=\1 [L] 

В в любом случае это предполагает, что вы будете только переписывать URL-адреса с одним компонентом пути (т. е. если вы получите запрос, например /path/anything.anyextension, он может не работать так, как вы ожидаете, для того чтобы его обработать было необходимо изменить правило перезаписи)

+0

Это не поймать ny без расширений –

+0

@Ast: да, это желаемое поведение. –

0

Вам нужен лучший способ определить, когда применять правило перезаписи, иначе ваша страница не сможет отображать внешние JS или CSS, если вы не определяете исключение.

SilverStripe (или ядро, Sapphire) предлагает хороший подход к этому, что-то вроде:

RewriteEngine On 
RewriteCond %{REQUEST_URI} !(\.css)|(\.js)|(\.swf)$ [NC] 
RewriteCond %{REQUEST_URI} .+ 
RewriteRule ^([^\.]+) /?post=$1 [L,R=301] 

Это требует URI не быть пустым, чтобы не быть JS, CSS или SWF, и перенаправляет обратно в корневой директории:

http://localhost/this-is-a-post.php 
http://localhost/?post=this-is-a-post 

Если вы не хотите, перенаправление, но обработка, удаление правила переадресации R=301