2017-02-11 6 views
1

Во-первых, чего я пытаюсь достичь: Я тестирую под базой http://example.com/subdir, и здесь находятся все подпапки, index.php и .htaccess.htaccess: относительные пути не работают должным образом

У меня есть 3 группы правил, как показано в .htaccess (дополнительные правила удалены):

<IfModule mod_rewrite.c> 
Options +FollowSymlinks 
RewriteEngine on 

# Convert item/edit/xx -> index.php?p=edit&id=xx 
# Convert item/remove/xx -> index.php?p=remove&id=xx 
#RewriteCond %{REQUEST_URI} ^/item [NC] 
#RewriteCond %{QUERY_STRING} ^id=([0-9]+)$ [NC] 
RewriteRule ^item/([a-z]+)/([0-9]+)$ index.php?p=$1&id=$2 [NC,L] 

# Convert category/yyyy -> customer/pagination.php?category=yyyy 

#RewriteCond %{QUERY_STRING} category=([a-zA-Z\s]+)$ 
RewriteRule ^customer/category/([a-zA-Z\s]+)$  customer/pagination.php?category=$1 [NC,L] 


# Convert action/about -> index.php?p=about 
# Convert action/terms -> index.php?p=terms 


#RewriteCond %{QUERY_STRING} p=([a-z]+)$ 
RewriteRule ^action/([a-z]+)$  index.php?p=$1 [NC,L] 

</IfModule> 

Первая проблема, которую я столкнулся прошел RewriteCond не работает (давая путь не найден), так комментирует на данный момент. RewriteRule работает отлично с абсолютным путем (например, RewriteRule^action/([az] +) $ http://example.com/subdir/index.php?p= $ 1 [NC, L]), однако это заставляет браузер отображать реальный URL, поэтому я пытаюсь заставить его работать с относительным пути. Моя проблема заключается в том, что после первого перенаправления первая часть ссылки слева добавляется в путь, то есть http://example.com/subdir становится http://example.com/subdir/action после нажатия ссылки/о ссылке. Определение RewriteBase или добавочных косых черт к URL-адресам только ухудшает ситуацию. Буду благодарен орлиному эксперту, который может определить причину моей проблемы.

+0

Я не совсем понимаю вторую часть вашего вопроса. Каким будет URL-адрес примера, который вызывает ошибку, какой путь вы хотите перенаправить, и на какой путь он действительно перенаправлен? – Anonymous

+0

Пример URL-адреса: http://example.com/subdir/action/about. При нажатии на нее перенаправляется на правильную страницу «О программе», однако путь для следующего запроса становится http://example.com/subdir/action/. Поэтому, когда вы нажимаете, скажем, ссылку action/terms - результат url = http: //example.com/subdir/action/action/terms. Обратите внимание на добавленную дополнительную папку «действие» в путь (мне нужно перенаправить на http://example.com/subdir/index.php?p=terms). Все ссылки относительны BTW, например. Действие/о. Спасибо. – user2097141

ответ

1

Первая проблема заключается в том, что %{REQUEST_URI} всегда включает в себя полный путь. Таким образом, ваше состояние может быть изменено на:

RewriteCond %{REQUEST_URI} ^/subdir/item [NC] 

Вторая проблема была на самом деле не будет решена с помощью .htaccess. Вам просто нужно сообщить браузеру, что вы хотите. Таким образом, вы можете использовать один из двух методов.

  1. Используйте <base> элемент (который будет применяться к всех относительных URI, на странице):

    <base href="/subdir" /> 
    
  2. Используйте относительный путь к URL, указанный в браузере:

    <a href="terms">Click here</a> 
    

Если вы действительно решили решить проблему используя .htaccess, единственный реальный способ сделать это - удалить дублированный каталог после его запроса.

+1

Большое спасибо, установка помогла, хотя мне пришлось изменить все перенаправления заголовков в PHP на абсолютные пути, чтобы все ссылки работали. Я выложу полный код после того, как я получу #RewriteCond% {QUERY_STRING}^id = ([0-9] +) $ [NC] для работы. – user2097141

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