Mod_Rewrite и частично очищенные URL работают - PullRequest
1 голос
/ 23 марта 2012

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

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

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

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

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

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

sitename.com / Событие / 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]

Ответы [ 3 ]

1 голос
/ 23 марта 2012

Проблема заключается во взаимодействии правил 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]+)/, но я видел это с непреднамеренными подзапросами перед запуском, поэтому я хотел бы предложить, чтобы вы исключили возможность подзапроса, приводящего к потере логики, добавив первыйrule:

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

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

0 голосов
/ 09 июня 2013

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

#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]
0 голосов
/ 29 марта 2012

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

...