столкновение mod_rewrite и mod_dir - PullRequest
1 голос
/ 04 июля 2011

Я редактирую свой htaccess для внутренних перенаправлений почти любой URL к обработчику страницы php:

RewriteRule ^images\/ - [L,NS]
RewriteRule ^docs\/ - [L,NS]
RewriteRule ^([A-Za-z0-9\_\-]+)\/?$ pages/pagehandler.php?page=$1 [L,QSA,NS]

это прекрасно работает, примите, что каталоги, которые входят в адрес панель без косой черты по какой-то причине получает повторяющиеся строки запроса, и почему-то меняется адресная строка браузера например, если я наберу URL:

локальный / фильмы

если в корне сайта есть каталог с фильмами чем адрес меняется на:

LOCALHOST / фильмы /? Страница = фильмы

Полагаю, это какое-то столкновение с mod_dir, но я не знаю, как это побороть, если я использую:

<IfModule mod_dir.c>
   DirectorySlash Off
</IfModule>

Чем это работает, но я не хочу этого, я думаю, почему-то URL перезаписывается, чем мод dir меняет его и затем перезаписывается создание дублирующих строк запроса,

Есть идеи?

РЕДАКТИРОВАТЬ: Я добавить соответствующую часть Rewritelog, это все из одного запроса:

strip per-dir prefix: /opt/lampp/htdocs/movies -> movies
applying pattern '^images\/' to uri 'movies'
strip per-dir prefix: /opt/lampp/htdocs/movies -> movies
applying pattern '^docs\/' to uri 'movies'
strip per-dir prefix: /opt/lampp/htdocs/movies -> movies
applying pattern '^pages\/' to uri 'movies'
strip per-dir prefix: /opt/lampp/htdocs/movies -> movies
applying pattern '^([A-Za-z0-9\_\-]+)\/?$' to uri 'movies'
rewrite 'movies' -> 'pages/pagehandler.php?page=movies'
split uri=pages/pagehandler.php?page=movies -> uri=pages/pagehandler.php, args=page=movies
add per-dir prefix: pages/pagehandler.php -> /opt/lampp/htdocs/pages/pagehandler.php
trying to replace prefix /opt/lampp/htdocs/ with /
strip matching prefix: /opt/lampp/htdocs/pages/pagehandler.php -> pages/pagehandler.php
add subst prefix: pages/pagehandler.php -> /pages/pagehandler.php
internal redirect with /pages/pagehandler.php [INTERNAL REDIRECT]
strip per-dir prefix: /opt/lampp/htdocs/movies/ -> movies/
applying pattern '^images\/' to uri 'movies/'
strip per-dir prefix: /opt/lampp/htdocs/movies/ -> movies/
applying pattern '^docs\/' to uri 'movies/'
strip per-dir prefix: /opt/lampp/htdocs/movies/ -> movies/
applying pattern '^pages\/' to uri 'movies/'
strip per-dir prefix: /opt/lampp/htdocs/movies/ -> movies/
applying pattern '^([A-Za-z0-9\_\-]+)\/?$' to uri 'movies/'
rewrite 'movies/' -> 'pages/pagehandler.php?page=movies'
split uri=pages/pagehandler.php?page=movies -> uri=pages/pagehandler.php, args=page=movies&page=movies
add per-dir prefix: pages/pagehandler.php -> /opt/lampp/htdocs/pages/pagehandler.php
trying to replace prefix /opt/lampp/htdocs/ with /
strip matching prefix: /opt/lampp/htdocs/pages/pagehandler.php -> pages/pagehandler.php
add subst prefix: pages/pagehandler.php -> /pages/pagehandler.php
internal redirect with /pages/pagehandler.php [INTERNAL REDIRECT]

Также соответствующая часть из журнала доступа:

"GET /movies HTTP/1.1" 301
"GET /movies/?page=movies HTTP/1.1" 200

Ответы [ 3 ]

1 голос
/ 24 июля 2011

Для тех, у кого возникла эта проблема, что я в конечном итоге сделал, чтобы отключить косую черту каталога:

<IfModule mod_dir.c>
   DirectorySlash Off
</IfModule>

И я использовал RewriteRule для 301 перенаправления всех запросов каталога, которые не заканчиваются на /

Полагаю, это какая-то коллизия между mod_rewrite и mod_dir, как я и думал в первую очередь

1 голос
/ 04 июля 2011

Можете ли вы изменить правило перезаписи на:

RewriteRule ^([A-Za-z0-9\_\-]+)/?$ /pages/pagehandler.php?page=$1 [L,QSA,NS]

Обратите внимание на / перед pages.

0 голосов
/ 20 января 2012

И я использовал RewriteRule для 301 перенаправления всех запросов каталога, которые не заканчиваются на /

У меня была похожая проблема, но я не смог найти решение по mod_rewrite (не знал, как добавить эту косую черту с перенаправлением 301 - попробовал все).

Что я сделал, так это определил:

<IfModule mod_dir.c>
   DirectorySlash Off
</IfModule>
ErrorDocument 404 404.php

Если теперь косая черта пропущена, используется 404.php для перенаправления клиента, если в URL теперь нет косой черты:

<?php 
$home="http://".$_SERVER['HTTP_HOST'];
$url=$home.$_SERVER['REQUEST_URI']; 
?><html>
<head>
<title><?php echo $_SERVER['REDIRECT_STATUS']; ?></title>
<?php if(!preg_match('/^.+\/$/', $url)) { ?>
<meta http-equiv="refresh" content="0; URL=<?php echo $url; ?>/">
<? } ?>
</head>
<body>
<h1><?php echo $_SERVER['REDIRECT_STATUS']; ?></h1>
</body>
</html>

Это пахнет адом, но работает формально ...

...