2012-01-01 5 views
3

Я хотел перенаправить/переписать мои файлы name.php в/name/ Я нашел решение по другой теме (http://stackoverflow.com/questions/5527789/htaccess -rewrite-inside-directory-hide-php-extension-and-force-trailing-slash)/file.php to/file/try

Хотя, я хотел узнать его сам и начать с нуля. я впервые использовал этот, что делает, например, .com/тест/показать содержание .com/test.php:

RewriteEngine On 
RewriteRule ^(.*)/$ $1.php 

Затем я попытался следующие, сам по себе, который перенаправляет .com/test.php к .com/test /:

RewriteEngine On 
RewriteRule ^(.*)\.php$ http://www.mydomain.info/$1/ [R=301] 

Итак, оба работают самостоятельно. Но когда я их совмещаю, я получаю ошибку цикла, даже когда я добавляю [L] к ней, что должно означать, что правила должны использоваться только один раз. Так что это не работает:

RewriteEngine On 
RewriteRule ^(.*)/$ $1.php [L] 
RewriteRule ^(.*)\.php$ http://www.mydomain.info/$1/ [L,R=301] 

Я, вероятно, сделал какие-то дурацкие ошибки, но это, кажется, логически мне ... Надежда кто-то может указать на мою ошибку. Спасибо.

+0

уточните, пожалуйста, обновленный ответ. – ziesemer

ответ

1

Поскольку у вас есть внешняя переадресация с R=301, добавление L к ней не поможет столько, сколько вам нужно, так как перенаправление вернется на сервер как новый запрос - где он снова соответствует вашему первому переписыванию править.

Вместо этого, вам нужно что-то вроде этого:

RewriteCond %{THE_REQUEST} ^\w+\ /(.*)\.php\ HTTP/ 
RewriteRule^/%1/ [R=301] 

RewriteRule ^(.*)/$ $1.php 

Обратите внимание, что THE_REQUEST соответствует всей линии исходного запроса, например, GET /index.php HTTP/1.1. Даже когда %{REQUEST_URI} переписан на .php как часть 2-го правила (где он будет соответствовать внутреннему подпросу), %{THE_REQUEST} никогда не будет перезаписан, и это гарантирует, что URL-адрес, переписанный на .php, не совпадает с подзапросом и привести к другому перенаправлению, отправленному обратно клиенту.

1

Снять L-флаг с первого правила. Это остановит «выполнение», и второе правило не будет использоваться. Во втором правиле вы должны держать флаг L, потому что он является последним.

+0

Я тестировал это, и он, похоже, не работает. – ziesemer

+0

Было бы здорово, если бы это сработало, но я получаю те же результаты с или без него. – Steven

+0

Но вы также выпускаете, что R = 301? – Dion

Смежные вопросы