2013-08-21 2 views
0

Итак, мой веб-сервер обслуживает файлы, такие как file_name.php. Я хочу сделать так, чтобы запросы на file-name.php были прозрачно перенаправлены на file_name.php, и запросы на file_name.php явно перенаправляются через 301-редирект в файл-name.php.изменение запросов с двумя правилами перезаписи

ie. вы запрашиваете file_name.php, и вы получаете 301, перенаправленный на file-name.php, который вместо этого загружает файл file_name.php.

К сожалению, файл .htaccess, который я написал для этого, не работает. Вот он:

# make it so files with slashes that don't exist transparently redirect to files with underscores 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([^-]*)-([^-]*)$ $1_$2 
RewriteRule ^([^-]*)-([^-]*)-([^-]*)$ $1_$2_$3 

# make it so files with underscores that do exist explicitely redirect to files with slashes 
RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule ^([^_]*)_([^_]*)$ /$1-$2 [L,R=301] 
RewriteRule ^([^_]*)_([^_]*)_([^_]*)$ /$1-$2-$3 [L,R=301] 

Самостоятельно они работают, но вместе они приводят к бесконечному циклу.

Любые идеи?

ответ

1

Это действительно интересная проблема.

код, который я предлагаю, общие рекурсии коды на основе, который будет переводить каждый _ по - в URL извне (независимо от того, сколько подчеркивания есть). В то время как внутри он выполняет обратный перевод и загружает фактический URL.

# Only single underscore do an external 301 redirect 
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+([^_]+)_([^_\s]*) [NC] 
RewriteRule^/%1-%2 [R=301,L] 

# Recursively translate each _ to - in URL and do external 302 redirect 
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+([^_]+)_([^\s]*) [NC] 
RewriteRule^/%1-%2 [R,L] 

# Recursively translate - to _ to load actual URL internally 
RewriteRule ^([^-]+)-(.*)$ /$1_$2 [L] 
+0

Мне нравится ваше решение! Я пошел вперед и добавил 'RewriteCond% {REQUEST_FILENAME}! -f' к этому третьему' RewriteRule', так что если файл с тире уже существует, он не будет перенаправлен внутренне. Благодаря! – neubert

+0

Да, это условие будет удобно. – anubhava

+0

Почему вы делаете 301 переадресацию для одного _, но 302 переадресации, если есть несколько _? – neubert

1

Поскольку URI перезаписывается, а затем снова подключается к механизму перезаписи, вы получите цикл переадресации. Вы должны перенаправить извне, сопоставляя запрос, а не URI. Кроме того, перепишет условие применимо только к непосредственно следующему правилу перезаписи, так что вам нужно, чтобы дублировать их для каждого из правил:

# make it so files with slashes that don't exist transparently redirect to files with underscores 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([^-]*)-([^-]*)$ $1_$2 [L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([^-]*)-([^-]*)-([^-]*)$ $1_$2_$3 [L] 

# make it so files with underscores that do exist explicitely redirect to files with slashes 
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^_]*)_([^_]*)_([^_\ \?]*) 
RewriteRule^/%1-%2-%3 [L,R=301] 

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^_]*)_([^_\ \?]*) 
RewriteRule^/%1-%2 [L,R=301] 
Смежные вопросы