PHPackages                             andersundsehr/reduce-duplicate-content - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. andersundsehr/reduce-duplicate-content

ActiveTypo3-cms-extension[Utility &amp; Helpers](/categories/utility)

andersundsehr/reduce-duplicate-content
======================================

redirect if page has a / at the end (or not). (reduce Duplicate Content)

1.2.0(9mo ago)215.9k↓53.2%1GPL-2.0-or-laterPHPPHP ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0CI passing

Since Mar 27Pushed 9mo ago1 watchersCompare

[ Source](https://github.com/andersundsehr/reduce-duplicate-content)[ Packagist](https://packagist.org/packages/andersundsehr/reduce-duplicate-content)[ RSS](/packages/andersundsehr-reduce-duplicate-content/feed)WikiDiscussions main Synced yesterday

READMEChangelog (6)Dependencies (4)Versions (8)Used By (0)

TYPO3 EXT:reduce\_duplicate\_content
====================================

[](#typo3-extreduce_duplicate_content)

`composer req andersundsehr/reduce-duplicate-content`

What dose this Extension do?
----------------------------

[](#what-dose-this-extension-do)

it aims to reduce the URL's there the same content is reachable.

The main point is that by default TYPO3's pages are accessible like this: `/en/page-a` and `/en/page-a/`.

With one simple setting you can change if you always want trailing Slashes or if you never want them.

This setting only sets the way TYPO3 generates the URL's.
But the content is still accessible by both URL's

This is there this Extension comes in.

How dose it solve this Problem:
-------------------------------

[](#how-dose-it-solve-this-problem)

We Generate a URL for the Current Page and Language.
If this URL matches the current Request URL (ignoring the Slash at the end.)
Only than we directly compare the URL's.
If they do not match we redirect to the correct URL.

How is it different to studiomitte/redirect2trailingslash
---------------------------------------------------------

[](#how-is-it-different-to-studiomitteredirect2trailingslash)

[EXT:redirect2trailingslash](https://github.com/studiomitte/redirect2trailingslash) is only usefull if you always want slashes at the end.
With our approach it is also possible to remove the slashes.
Also it should have way less errors because of the way we compare it with the generated URL's.

If you want Trailing Slashes:
-----------------------------

[](#if-you-want-trailing-slashes)

you can configure a routeEnhancer like this:
file: `config/sites/.../config.yaml`

```
routeEnhancers:
  PageTypeSuffix:
    type: PageType
    # if you want to have trailing slashes for all pages:
    default: '/'
    index: ''
    map:
      /: 0
      sitemap.xml: 1533906435
```

If you do not want Trailing Slashes:
------------------------------------

[](#if-you-do-not-want-trailing-slashes)

you can remove the RouteEnhancer PageType.
or make sure that you do not use the `default`:

file: `config/sites/.../config.yaml`

```
routeEnhancers:
  PageTypeSuffix:
    type: PageType
    index: ''
    map:
      /: 0
      sitemap.xml: 1533906435
```

If you use staticfilecache you need to add these lines in the nginx config:
---------------------------------------------------------------------------

[](#if-you-use-staticfilecache-you-need-to-add-these-lines-in-the-nginx-config)

```
    # Ensure we redirect to TYPO3 for non GET/HEAD requests
    if ($request_method !~ ^(GET|HEAD)$ ) {
        return 405;
    }

    # Ensure we redirect to TYPO3 for urls ending with slash ####### THIS
    if ($request_uri ~ "^.*/$") {
        return 405;
    }

    # Ensure we redirect to TYPO3 for urls ending without slash ####### OR THIS
    if ($request_uri !~ "^.*/$") {
        return 405;
    }

    charset utf-8;
    default_type text/html;
    try_files /typo3temp/tx_staticfilecache/https_${host}_443${uri}/index /typo3temp/tx_staticfilecache/${scheme}_${host}_${server_port}${uri}/index =405;
```

Important! If you use staticfilecache:
--------------------------------------

[](#important-if-you-use-staticfilecache)

If you use staticfilecache, you have to disable the fallback middleware of staticfilecache: [![image](https://private-user-images.githubusercontent.com/33542979/306963728-d054ea7b-8d16-4f07-b4cc-01a89be40d8e.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODI5ODY2MTIsIm5iZiI6MTc4Mjk4NjMxMiwicGF0aCI6Ii8zMzU0Mjk3OS8zMDY5NjM3MjgtZDA1NGVhN2ItOGQxNi00ZjA3LWI0Y2MtMDFhODliZTQwZDhlLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA3MDIlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwNzAyVDA5NTgzMlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTM1NmEyNjRhMGVmN2QwNjdkNzk4MDZlODJmNmJmYmQzOTA3Mzg2YjE3YzBhOTc5YzYzOTdmZTQ1NmU5MTlmNjMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRnBuZyJ9.sZN30X2a6M6mXsM08DPv3E_dEgmAQz_LXbASt_cAxv8)](https://private-user-images.githubusercontent.com/33542979/306963728-d054ea7b-8d16-4f07-b4cc-01a89be40d8e.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODI5ODY2MTIsIm5iZiI6MTc4Mjk4NjMxMiwicGF0aCI6Ii8zMzU0Mjk3OS8zMDY5NjM3MjgtZDA1NGVhN2ItOGQxNi00ZjA3LWI0Y2MtMDFhODliZTQwZDhlLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA3MDIlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwNzAyVDA5NTgzMlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTM1NmEyNjRhMGVmN2QwNjdkNzk4MDZlODJmNmJmYmQzOTA3Mzg2YjE3YzBhOTc5YzYzOTdmZTQ1NmU5MTlmNjMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRnBuZyJ9.sZN30X2a6M6mXsM08DPv3E_dEgmAQz_LXbASt_cAxv8)

Change the 307 Status Code:
---------------------------

[](#change-the-307-status-code)

You can change it in the Extension Settings.

with ♥️ from anders und sehr GmbH
=================================

[](#with-️-from-anders-und-sehr-gmbh)

> If something did not work 😮
> or you appreciate this Extension 🥰 let us know.

> We are hiring

###  Health Score

46

—

FairBetter than 92% of packages

Maintenance58

Moderate activity, may be stable

Popularity30

Limited adoption so far

Community11

Small or concentrated contributor base

Maturity68

Established project with proven stability

 Bus Factor1

Top contributor holds 92.3% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~183 days

Recently: every ~222 days

Total

6

Last Release

276d ago

PHP version history (4 changes)1.0.0PHP ~8.1 || ~8.2

1.0.3PHP ~8.1.0 || ~8.2.0

1.1.0PHP ~8.1.0 || ~8.2.0 || ~8.3.0

1.2.0PHP ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/471387?v=4)[Matthias Vogel](/maintainers/Kanti)[@Kanti](https://github.com/Kanti)

![](https://www.gravatar.com/avatar/ce27306c234536251754f00414959671d4a775e9cf57cce2f5ea1dca158183d6?d=identicon)[andersundsehr](/maintainers/andersundsehr)

---

Top Contributors

[![Kanti](https://avatars.githubusercontent.com/u/471387?v=4)](https://github.com/Kanti "Kanti (12 commits)")[![Lagerregal42](https://avatars.githubusercontent.com/u/33542979?v=4)](https://github.com/Lagerregal42 "Lagerregal42 (1 commits)")

---

Tags

seoseo-optimizationtypo3typo3-extension

### Embed Badge

![Health badge](/badges/andersundsehr-reduce-duplicate-content/health.svg)

```
[![Health](https://phpackages.com/badges/andersundsehr-reduce-duplicate-content/health.svg)](https://phpackages.com/packages/andersundsehr-reduce-duplicate-content)
```

###  Alternatives

[friendsoftypo3/content-blocks

TYPO3 CMS Content Blocks - Content Types API | Define reusable components via YAML

103519.9k53](/packages/friendsoftypo3-content-blocks)[wazum/sluggi

TYPO3 extension for URL slug management with inline editing, auto-sync, locking, access control, and redirects

40529.5k](/packages/wazum-sluggi)[typo3/cms-scheduler

TYPO3 CMS Scheduler - Schedule tasks to run once or periodically at a specific time.

169.3M231](/packages/typo3-cms-scheduler)[typo3/cms-lowlevel

TYPO3 CMS Lowlevel - Technical analysis of the system. This includes raw database search, checking relations, counting pages and records etc.

178.2M316](/packages/typo3-cms-lowlevel)[typo3/cms-redirects

TYPO3 CMS Redirects - Create manual redirects, list existing redirects and automatically createredirects on slug changes.

167.4M80](/packages/typo3-cms-redirects)[typo3/cms-form

TYPO3 CMS Form - Flexible TYPO3 frontend form framework that comes with a backend editor interface.

147.6M265](/packages/typo3-cms-form)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
