Почему не работает мое правило перенаправления .htaccess 301? - PullRequest
2 голосов
/ 01 сентября 2011

Я использую переписывание URL на своем обновленном веб-сайте, чтобы придать URL-адресам более аккуратные страницы.

RewriteEngine On

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^$ index.php [L]

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^.+/$ %{REQUEST_URI}index.php [L]

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^(.+\.php|(.+/)?index)$ - [R=404,L]

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{SCRIPT_FILENAME}.php -f
RewriteRule ^(.+)$ $1.php [L]

Этот файл .htaccess позволяет / filename фактически указывать на /filename.php.Все работает нормально.

Однако теперь я понял, что должен установить 301 постоянную переадресацию, чтобы страницы старого сайта (до редизайна) могли перенаправлять на страницы нового сайта (для SEO).и связи причин).Страницы были реорганизованы, поэтому несколько старых страниц будут перенаправлены, например, на новые страницы.

Старый сайт не использовал перезапись URL.Поэтому я хочу создать постоянные перенаправления, такие как /about-page.php в / about, делая их вручную с одним правилом на старую страницу.

Я пробовал несколько вещей, таких как ...

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^about-page.php$ about [R=301,L]

... или ...

Redirect 301 /about-page.php /about

... но это всегда заканчивается либо не работает вообще (выдает ошибку 404 при попытке доступа к / old-filename.php, или ломает все с внутренними ошибками сервера. Кажется, это работает нормально, если я использую Redirect 301 /about-page.html /about, но, к сожалению, старые URL-адреса использовали расширения .php, а не расширения .html.

Я считаю, что проблема заключается всвязанных с одним из других правил, которые перенаправляют запросы на / xyz в /xyz.php, возможно, создавая какой-то бесконечный цикл. Но я не могу понять, как это исправить.

Любой совет? Спасибо большоемного.


Редактировать: Окончательный, рабочий файл .htaccess:

DirectoryIndex index.php #

RewriteEngine On

# -- Use a permanent redirect to point the old page to the new page.
# -- The RewriteCond is needed, or a redirect loop happens in certain cases.
# -- The full URL seems to be needed, or it redirects incorrectly.
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^about-page.php$ http://www.mywebsite.com/about [R=301,L]

# -- Redirect most other .php files to a 404 error, to avoid duplicate content.
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^(.+\.php|(.+/)?index)$ - [R=404,L]

# -- Redirect requests without an extension, but for a valid file, to that file.
# -- I'm not sure what the RewriteCond lines are for, but they both seem necessary.
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{SCRIPT_FILENAME}.php -f
RewriteRule ^(.+)$ $1.php [L]

1 Ответ

1 голос
/ 01 сентября 2011
DirectoryIndex index.php # -- this sets index.php to be default file for a folder

RewriteEngine On

# -- RewriteRule ^(.+\.php|(.+/)?index)$ - [R=404,L]
# -- dude this above line redirects all php files to 404 error
# -- so delete this, its a problem not solution

RewriteCond %{SCRIPT_FILENAME}.php -f
RewriteRule ^(.+)$ $1.php [L]

RewriteRule ^about-page.php$ /about [R=301,L]

Это должно сработать, прокомментируйте, если возникнет проблема

...