Mod_Rewrite и чистые URL-адреса частично работают

Редактировать № 2: я отключил свою страницу 404, и страница не найдена по умолчанию говорит, что она ищет URL-адрес с .php после него:

"Запрошенный URL /events/2012.php не найден на этом сервере"

Так что теперь я считаю, что он ищет реальный файл, когда он не существует. кто-нибудь??

Редактировать № 1: похоже, что перенаправление зацикливания исправлено, но я до сих пор не могу понять, почему перезаписи не работают для страницы событий. /events/ работает нормально, но /events/2012/title-id/ переходит к 404. /breweries/ и arizona-breweries/brewery-name/ тоже работают, так что я не уверен, что мне не хватает.

Я пытаюсь добавить новую структуру каталогов на свою страницу events.php. events/2012/... У меня есть другая структура каталогов в breweries.php, которая отлично работает.

Когда я пытаюсь загрузить событие sitename.com/events/2012/title-of-event-3/, оно зацикливается и говорит «слишком много перенаправлений», а URL-адрес выглядит так:

sitename.com/events/2012/название-события-3.php.php.php.php.php.php.php.php.php.php.php/

Думаю, 6 часов поиска ответа было достаточно. Любая помощь приветствуется!

(и нет, у меня нет sitename.com в моем реальном файле htaccess)

Мой файл htaccess:

Options +FollowSymLinks -Multiviews
RewriteEngine on

RewriteBase /

#remove php file extension
#RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteCond %{REQUEST_URI} !^/blog/
RewriteRule ^(.*)/$ $1.php [QSA,L]

#clean urls
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^events/([0-9]+)/(.*)-([0-9]+)/$ events.php?year=$1&title=$2&id=$3 [R,NC,QSA]
RewriteRule ^(.*)-breweries/$ breweries.php?loc=$1 [NC,QSA]
RewriteRule ^(.*)-breweries/(.*)/$ breweries.php?loc=$1&brewery=$2 [NC,QSA,L]

#Force trailing slash after url
RewriteCond %{REQUEST_FILENAME} !-f
#RewriteCond %{REQUEST_URI} !example.php
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ http://www.sitename.com/$1/ [L,R=301]

#force www
RewriteCond %{HTTP_HOST} !^www.sitename.com$
RewriteRule ^(.*)$ http://www.sitename.com/$1 [R=301,L]

person n1ch0la5    schedule 22.03.2012    source источник


Ответы (3)


Проблема представляет собой взаимодействие правил 1 и 5.

Правило 5 заставляет / после любого URI, который не отображается на имя файла, следовательно

http://sitename.com/events/2012/title-of-event-3.php.php ->
    http://sitename.com/events/2012/title-of-event-3.php.php/

А затем правило 1 карты

http://sitename.com/events/2012/title-of-event-3.php.php/ ->
    http://sitename.com/events/2012/title-of-event-3.php.php.php

Вопрос в том, как вообще застрять в этой петле? Я не уверен, почему, потому что events/2012/title-of-event-3/ будет соответствовать ^events/([0-9]+)/(.*)-([0-9]+)/, но я видел это с непреднамеренными подзапросами befire, поэтому я бы посоветовал вам устранить возможность запуска подзапроса, испортившего вашу логику, добавив первое правило:

RewriteCond %(IS_SUBREQ}%{ENV:REDIRECT_END} y|1
RewiteRule  ^                           -    [L]

и добавление E=END:1 к вашим флагам правил, на которых вы хотите завершить цикл перезаписи.

person TerryE    schedule 22.03.2012
comment
Хорошо, теперь мы к чему-то пришли, мне пришлось использовать модифицированную версию вашего кода, потому что она продолжала выдавать мне ошибку 500: RewriteCond %{ENV:REDIRECT_STATUS} !^$ [OR] RewriteCond %{IS_SUBREQ} =true RewriteRule .* - [L] Это остановило циклические перенаправления, но я все еще не могу получить доступ к /events/2010/title- 3/. Однако теперь он просто показывает обычный 404 Not Found вместо .php.php.php и т. д. - person n1ch0la5; 23.03.2012
comment
у вас есть events.php в вашем docroot? - person TerryE; 25.03.2012
comment
Да, events.php находится в корневой папке. Я совершенно озадачен. - person n1ch0la5; 26.03.2012

Я решил это. Мне пришлось переместить раздел, удаляющий расширение .php, ниже раздела перезаписи URL (чуть выше принудительной части www), и это сработало. очевидно, что когда-то раздел пивоварен был в нужном месте, поэтому он продолжал работать, но когда я попытался добавить новую переработку, он не работал должным образом.

person n1ch0la5    schedule 29.03.2012

привет всем, я думаю, что это очень поможет, что вам нужно сделать, это разрешить сопоставление некоторого вида, которое является запросом, таким как /someurl/somescript", сопоставляться с /someurl/somescript.php, но поскольку вы используете этот вид сопоставления, не забудьте исключить некоторые из важных частей, которые могут попасть в каталог, такой как /someurl/css, определенно будут указывать на папку вашей таблицы стилей, и вы не захотите, чтобы она добавлялась или сопоставлялась с чем-то вроде /someurl/css.php‹ после перезаписи. правило выполняется. используйте это, оно будет работать для /someurl/somescript или /someurl/dir/somescript или /someurl/dir11/dir2/somescript

#prevents loops
Options +FollowSymlinks -MultiViews
RewriteEngine On
RewriteBase /
#conditions below prevents directory 
RewriteCond %{REQUEST_FILENAME} !-d  
RewriteCond %{REQUEST_FILENAME} !css$  [NC]
RewriteCond %{REQUEST_FILENAME} !js$  [NC]
#conditions below exclude some of the file extension that you might be using on your   system
RewriteCond %{REQUEST_URI} !\.ico$  [NC]
RewriteCond %{REQUEST_URI} !\.css$  [NC]
RewriteCond %{REQUEST_URI} !\.js$  [NC]
RewriteCond %{REQUEST_URI} !\.svg$  [NC]
RewriteCond %{REQUEST_URI} !\.png$  [NC]
RewriteCond %{REQUEST_URI} !\.jpeg$  [NC]
RewriteCond %{REQUEST_URI} !\.jpg$  [NC]
#condition checks  for any file that dont ends with .php which would have selected all the file that forced to exclude all the file not ending with .php thus including even dir that why to exclude them above
RewriteCond %{REQUEST_URI} !\.php  [NC]
# Map internally to the resource, showing the "pretty" URL in the address bar
#note that /? indicate zero or more of / and [^/] states do nt include / on the begining, the + indicates that one or more with fullstop preceding it means one or more of any character
#RewriteRule  ^([^/]+)/?   /$1.php  [NC]
 #note that the rule below is different from above because it allows one or more ^([^/]+)/? which is achieved by having it grouped by () and appending a plus 
RewriteRule  (^([^/]+)/?)+  %{REQUEST_URI}.php  [NC]
person francis.p.mariki    schedule 09.06.2013