2016-05-23 3 views
1

Я пытаюсь создать slugs в localhost подкаталог..htaccess - "friendly url" (slugs)

У меня есть этот .htaccess код:

Options +FollowSymLinks -MultiViews 
RewriteEngine On 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 

RewriteBase ^subdirectory/ 

RewriteRule ^subdirectory/search/([a-zA-Z0-9]+)/$ subdirectory/search.php?q=$1 [L,R=301] 
RewriteRule ^subdirectory/page/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/$ subdirectory/page.php?page_name=$1&page_id=$2 [L,R=301] 

В search.php и page.php У меня есть эти коды:

search.php

<?php $q = $_GET[ 'q' ]; ?> 

page.php

<?php 
    $page_name = $_GET[ 'page_name' ]; 
    $page_id = $_GET[ 'page_id' ]; 
?> 

, но для некоторого r eason, он дает всего 404 ошибки каждый раз, и если это не так, это работает, но в родительском каталоге («localhost», «www»)

Я много искал, но не нашел решения все же.

mod_rewrite включена, так что делает AllowOverride All

с помощью WAMP сервера (v. 2.5), апаш 2.4.9

спасибо всем.

+0

Вы включили 'mod_rewrite' и установили' AllowOverride All' директиву в вашем файле конфигурации? – Muriano

+0

@ Обновление Muriano - я проверил, оба из них включены – natanelg97

+0

вы повторяете строку подкаталога^и RewriteBase и RewirteRule, можете ли вы попытаться изменить это? – Muriano

ответ

1

Я считаю, что у ваших правил .htaccess есть несколько проблем.

Прежде всего, RewriteBase должен установить корневой путь так, чтобы вам не приходилось выполнять его в каждом правиле. Другими словами, RewriteBase /subdirectory/ означает, что вам не нужно включать subdirectory в фактические операторы RewriteRule.

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

без изменения, что регулярное выражение можно использовать/поиск/Foobar/и/страница/Foo/бар /, чтобы заставить его работать, если вы сделаете RewriteBase и относительный URL modificationin файла .htaccess соответственно:

Options +FollowSymLinks -MultiViews 
RewriteEngine On 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 

RewriteBase /subdirectory/ 

RewriteRule ^search/([a-zA-Z0-9]+)/$ search.php?q=$1 [L,R=301] 
RewriteRule ^page/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/$ page.php?page_name=$1&page_id=$2 [L,R=301] 

PS. Вероятно, вы также захотите удалить 301, так как это фактически перенаправляет пользователя на пути .php-файла.

+0

Он по-прежнему дает ошибку 404: \ Я пробовал то, что вы сказали также о завершающем косе (удалил знак $), но все еще не работает ... – natanelg97

+0

Я бы начал с рассмотрения журнала, потому что я успешно пробовал его на стандартном Linux/Apache сервер. Включить трассировку через LogLevel, как описано здесь: http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#logging –

+0

@ natanel97 Я сделал небольшую демонстрацию на своем dev-сервере, не будет доступен навсегда, Я оставлю его на несколько дней: http://dirtylogic.org/test/ –