Как я могу перенаправить все подкаталоги в root, используя htaccess или httpd.conf? - PullRequest
4 голосов
/ 29 июля 2011

У меня есть индексный файл, который строит контент на основе n переменных PATH_INFO.

Пример:

site.com/A/B/n/

должен использовать index.php в любом из них:

site.com/index.php?var1=A&var2=B&varN=n
 - or - 
site.com/index.php/A/B/n/

вместо:

site.com/A/B/n/index.php || which doesn't exist ||

До сих пор я пробовал несколько вариантов:

RedirectMatch ^/.+/.*$ /

без успеха.

У меня есть не элегантное и не масштабируемое решение здесь:

RewriteEngine On 
RewriteRule ^([a-zA-Z0-9_-]+)/?$ index.php?p1=$1 [NC,L]
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/?$ index.php?p1=$1&p2=$2 [NC,L]
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/?$ index.php?p1=$1&p2=$2&p3=$3 [NC,L]
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/?$ index.php?p1=$1&p2=$2&p3=$3&p4=$4 [NC,L]

Проблемы с этим решением:

  • Не элегантное и не масштабируемое, требуется ручная строка для каждого подкаталога
  • Сбой с не алфавитно-цифровыми символами (в основном +, = и &) ex.site.com/ab&c/de+f/ (обратите внимание, что даже изменение регулярного выражения на ^ ([a-zA-Z0-9 _- \ + \ = \ & ] +) /? $ мало что даетпомочь и на самом деле делает ошибку полностью)

Можете ли вы помочь?

Ответы [ 3 ]

7 голосов
/ 30 июля 2011

Вариант 1: (site.com/index.php?var1=A&var2=B&varN=n):

Options +FollowSymLinks -MultiViews
RewriteEngine On

# do not do anything for already existing files
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .+ - [L]

RewriteRule ^([^/]+)/?$ index.php?p1=$1 [QSA,L]
RewriteRule ^([^/]+)/([^/]+)/?$ index.php?p1=$1&p2=$2 [QSA,L]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ index.php?p1=$1&p2=$2&p3=$3 [QSA,L]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/?$ index.php?p1=$1&p2=$2&p3=$3&p4=$4 [QSA,L]

1. У вас был [NC] флаг ... поэтому вам не нужно было A-Z в вашем паттерне.

2. Вместо [a-zA-Z0-9_-\+\=\&] или [a-zA-Z0-9_-] я использую [^/], что означает любой символ, кроме косой черты /.

3. [QSA] Флаг был добавлен для сохранения существующей строки запроса.

Вариант 2: (site.com/index.php/A/B/n/):

Options +FollowSymLinks -MultiViews
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php/$1 [L]

В действительности, если вы не планируете показывать этот URL где-либо (например, перенаправление 301 и т. Д.), Последнюю строку можно легко заменить на RewriteRule .* index.php [L] - вы будете искать исходный URL, используя $_SERVER['REQUEST_URI'] в своем PHP код в любом случае.

3 голосов
/ 30 июля 2011

Добавление следующего перенаправит весь трафик (для файлов, которые не существуют) на страницу индекса:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*) index.php [NC]

Затем вы можете принять решение в index.php, проанализировав REQUEST_URI

0 голосов
/ 10 августа 2015

RewriteRule ^ /. + / [R = 301, L]

любой URL с любым видом пути за пределами root будет перенаправлен на root.

^ = start of url
/ = a slash
.+ = 1 or more characters
...