избегая дублирования URL с моим mod_write - PullRequest
0 голосов
/ 29 июня 2011

На данный момент у меня есть простой .htaccess, который приводит в порядок URL моей страницы, выбивая .php с конца или добавляя его, в зависимости от того, как вы на него смотрите.

По сути, /about.php станет /about.

Однако это приводит к тому, что моя страница доступна по обоим этим URL-адресам. Я могу просто смириться с этим и использовать теги rel = canonical, но я также хотел бы привести его в порядок в htaccess.

Есть ли лучший способ (умное правило) 301 .php для версии none .php, кроме ручного указания каждого URL?

Кроме того, мне действительно нужны эти правила перезаписи?

<IfModule mod_rewrite.c>


RewriteEngine On
RewriteBase /

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


ErrorDocument 404 /404


</IfModule>

Ответы [ 2 ]

0 голосов
/ 29 июня 2011

В ваших первоначальных правилах вы просто говорите, что любая страница, которая не является файлом или каталогом, должна быть перенаправлена ​​на одно и то же имя с добавлением .php.

Итак, что вам нужно сделать, чтобы«удалить» доступ к файлу .php - это замаскировать его перенаправлением.Таким образом, вы сообщаете клиентскому браузеру, что foo/foo.php на самом деле foo/foo.

. Это инициирует новый запрос клиента к foo/foo.

Затем вы сообщаете серверу, чтоfoo/foo на самом деле foo/foo.php.Это вызовет внутренний запрос на foo/foo.php.Итак, у вас есть петля.Мы должны избегать этого.Лучший обходной путь, который я нашел, - это проверить, где %{REDIRECT_URL} пусто или нет.

Наконец, правила таковы:

# External redirection from real file to virtual with safe guard for internal redirection.
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REDIRECT_URL} !^$ 
RewriteRule ^(.*)\.php$ /$1 [QSA,R=301,L]

# Internal redirection to real file.
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ /$1.php [QSA,L]

Не забывайте, что ЛЮБОЕ перезапись / перенаправление запускает новый запрос!

См .: Как работает перезапись URL?

0 голосов
/ 29 июня 2011

Чтобы перенаправить (301) каждый .php-URL к версии не .php (если это существующий файл), вы можете использовать этот:

RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{THE_REQUEST} \.php\ HTTP/.\..$
RewriteRule ^(.*)\.php$ /$1 [QSA,R=301,L]

Первые два RewriteCond в вашем .haccess на самом деле не требуются, потому что у вас все равно будут конфликты, например. если у вас есть файлы foo.htm и foo.htm.php, какой из них должен отображаться при запросе foo.htm?

Итак, полный mod_rewrite блок:

RewriteEngine On
# redirect /foo.php to /foo
 RewriteCond %{REQUEST_FILENAME} -f
 RewriteCond %{THE_REQUEST} \.php\ HTTP/.\..$
 RewriteRule ^(.*)\.php$ /$1 [QSA,R=301,L]
# rewrite /foo to /foo.php
 RewriteCond %{REQUEST_FILENAME}.php -f
 RewriteRule ^(.*)$ /$1.php [QSA,L]
...